Javaにスレッドを確立するには、スレッドクラスを継承して実行可能なインターフェイスを実装する方法は2つあります。
スレッドを継承します
public class mythreadはスレッド{public mythread(string name){super(name); } int i; public void run(){for(i = 0; i <5; i ++){system.out.println(getname()+" - "+i); }} public static void main(string [] agrs){new MythRead( "Stread1")。start(); new mythread( "thread2")。start(); }} /*スレッド1-0thread 1-1thread 1-2thread 1-3thread 1-4thread 2-0thread 2-1thread 2-2thread 2-3thread 2-4* /上記のように、Javaのスレッドオブジェクトはクラスの形で作成する必要があり、このクラスではベースクラスのrun()メソッドをオーバーライドする必要があります。この方法は、実際にはスレッドの実行本体です。このクラスインスタンスの開始方法を呼び出すと、暗黙的に実行方法を呼び出します。
Mythreadが2回新しいため、2回の例が異なること、つまり、それぞれが互いに独立した独自のI変数があることを見るのは難しくありません。
実行可能なインターフェイス
パブリッククラスmyrunnableは実行可能{int i; public void run(){for(i = 0; i <50; i ++){system.out.println(thread.currentthread()。getname()+" - "+i); // this.getName()は直接使用できません}} public static void main(string [] agrs){myrunnable new new new();新しいスレッド(myrun、 "thread1")。start();新しいスレッド(myrun、 "thread2")。start(); }} /*スレッド1-0thread 1-1thread 2-0thread 2-3thread 2-4thread 2-5thread 2-6thread 2-7thread 2-8thスレッド2-9thスレッド2-9スレッド2-11スレッド2-12thスレッド2-13thread 2-14thスレッド2-18thスレッド2-18番目のスレッド2-18番目のスレッド2-18番目のスレッド2-22thスレッド2-23thスレッド2-24thスレッド1-17thスレッド2-25スレッド1--26スレッド2-27スレッド1-28スレッド1-30スレッド2--29スレッド1--31スレッド2--32スレッド2--34スレッド2--35スレッド2--36スレッド2--40スレッド1--42スレッド1--44スレッド1--45スレッド2--43スレッド1--46スレッド2--47スレッド2--49スレッド1-48*/この方法は、ターゲットが同じ参照オブジェクトである限り、新しいスレッドオブジェクトが新しいスレッドオブジェクトがある場合でも、オブジェクトの実行方法が呼び出され、すべてのスレッドがターゲットオブジェクトのリソースを共有している場合でも、ターゲットとしてオブジェクトをスレッドクラスにロードすることであるためです。したがって、スレッド1とスレッド2が合計51回出力され、2つのスレッドがIからの出力が0から49に完了し、上記のようにそれぞれ5回出力しないことがわかります。 51が出力される理由については、2つのスレッドがほぼ同時に対応状態に入ります(開始方法により、スレッドが準備ができた状態に入るだけです)。Iが0に等しい場合、スレッド1とスレッド2が同時に実行状態になり、同時フェノメノン、およびI = 0の出力をもたらすことを見つけることは難しくありません。その後、CPUは常にスレッドを切り替えているため、1つのスレッドのみが同時に出力されます。
スレッドステータス
スレッドは4つの状態に分かれています
Ready State:Start Methodを呼び出して、Ready Stateを入力します。
ランニング状態:準備ができた状態のスレッドはJVMによってスケジュールされ、ランニング状態になります。
ブロッキング状態:いくつかの同期方法が結果を返さない場合、ブロッキング状態が発生するか、睡眠とYeildが発生します。
死の状態:メソッド本体が実行されるか、スレッドが停止することを余儀なくされます。
スレッドの基本操作
[JOIN()マージスレッド:現在のスレッドがスレッドの結合メソッドを呼び出すと、スレッドが続く前にスレッドが実行されるのを待ちます。
スリープ(長いミリ秒)スレッドスリープ:現在のスレッドをブロックすると、ブロッキング時間が上がったときにのみ続きます。再度ブロックすると、CPUの所有権は他のスレッドに引き渡されます。そのため、スレッド(1)はスレッドを切り替えるためによく使用されます。
**利回り()スレッド譲歩:** Yeildは睡眠に似ていますが、それはより高いレベルまたは同じレベルの他のスレッドに対する譲歩のみになります。他のスレッドがレベルよりも低い場合、スレッドは再び実行されます。
背景スレッド
プログラムがオペレーティングシステムによって実行された後、プロセスがあり、プロセスには少なくとも1つのスレッド(メインスレッド)があります。メインスレッドには、他のスレッドよりも多くの特別な機能がありません。これは、実行される最初のスレッドであるため、メインスレッドで他のスレッドが作成されます。指定されていない場合、フォアグラウンドスレッド(メインスレッドを含む)はデフォルトで作成されます。 SetDaemon(True)が呼ばれる場合、スレッドはバックグラウンドスレッドとして明示的に設定されます。背景スレッドはデーモンスレッドです。名前からわかるように、その主な機能は、他のスレッドにガーディアンとサービス機能を提供することです。前景のすべてのスレッドが終了すると、背景スレッドは、現時点で存在する意味がないため、終了するように強制されます。
フォアグラウンドスレッド
public class foreandbackthreadはスレッド{public foreandbackthread(string name){super(name); } public void run(){int i; for(i = 0; i <9999; i ++){system.out.println(this.getName()+" - "+i); }} public static void main(string [] args){foreandbackthread th = new foreandbackthread( "thread a"); //th.setdaemon(true); th.start(); int j; for(j = 0; j <3; j ++){system.out.println(thread.currentthread()。getname()+" - "+j); }}}プログラムの完全な出力子スレッドは0〜9998です。これは、メインスレッドが特別ではなく、その端が他のフォアグラウンドスレッドの動作に影響しないことを意味します。
背景スレッド
public class foreandbackthreadはスレッド{public foreandbackthread(string name){super(name); } public void run(){int i; for(i = 0; i <9999; i ++){system.out.println(this.getName()+" - "+i); }} public static void main(string [] args){foreandbackthread th = new foreandbackthread( "thread a"); th.setdaemon(true); th.start(); int j; for(j = 0; j <3; j ++){system.out.println(thread.currentthread()。getname()+" - "+j); }}}プログラムは、0-9998を完全に出力して出力できず、前景のメインスレッドが終了した後、JVMが背景スレッドを終了させることを示します。
要約します
上記は、この記事のJavaスレッドの基本的な例の分析に関するすべてです。私はそれがすべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!