スレッドの状態
スレッドステータス図:
説明:
スレッドには、次の5つの状態が含まれます。
1。新しい状態:スレッドオブジェクトが作成された後、新しい状態に入ります。たとえば、スレッドスレッド= newスレッド()。
2。実行可能: 「実行可能状態」とも呼ばれます。スレッドオブジェクトが作成された後、他のスレッドはオブジェクトのstart()メソッドを呼び出してスレッドを開始します。たとえば、thread.start()。準備ができた状態のスレッドは、いつでもCPUによって実行されるようにスケジュールされる場合があります。
3。ランニング状態:スレッドは、実行のCPU許可を取得します。スレッドは、既製の状態からのみ実行状態に入ることができることに注意する必要があります。
4。ブロック状態:ブロック状態とは、スレッドが何らかの理由でCPUの使用権を放棄し、一時的に実行を停止することを意味します。スレッドが準備が整った状態に入るまで、実行中の状態に行く機会がありません。閉塞には3つのタイプがあります。
(1)ブロックを待つ - スレッドのwait()メソッドを呼び出すことにより、スレッドに特定の作業が完了するのを待たせます。
(2)同期ブロッキング - スレッドは、同期化された同期ロックを取得できません(ロックは他のスレッドで占有されているため)、同期されたブロッキング状態に入ります。
(3)その他のブロッキング - スレッドは、スレッドのSleep()またはJoin()を呼び出すか、I/Oリクエストを発行することにより、ブロッキング状態を入力します。 Sleep()状態がタイムアウトしたとき、Join()がスレッドが終了またはタイミングアウトするのを待っているか、I/O処理が完了した場合、スレッドは準備ができた状態に再入力されました。
5。DeadState:スレッドは、例外のために実行()メソッドの実行を終了または終了し、スレッドはライフサイクルを終了します。
これらの5つの状態に関係する内容には、オブジェクトクラス、スレッド、同期キーワードが含まれます。これらの内容は、次の章で1つずつ学習します。
オブジェクトクラスは、wait()、notify()、notifyall()などのスリープ/ウェイク関数を定義します。
スレッドクラスは、いくつかの列スレッド操作関数を定義します。たとえば、Sleep()Sleep機能、割り込み()割り込み関数、getName()getスレッド名など。
同期はキーワードです。同期されたコードブロックと同期されたメソッドによって区別されます。同期の機能は、スレッドがオブジェクトの同期ロックを取得できるようにすることです。
wait()、notify()、およびその他のメソッドを後で詳細に導入すると、「wait()、notify()、およびその他のメソッドがスレッドクラスではなくオブジェクトクラスで定義される理由を分析します。
マルチスレッドを実装する2つの方法:スレッドと実行可能
Runnableは、1つのrun()メソッドのみを含むインターフェイスです。その定義は次のとおりです。
public interface runnable {public abstract void run();} Runnableの役割は、マルチスレッドを実装します。クラスAを定義して、実行可能なインターフェイスを実装できます。次に、新しいスレッド(新しいa())およびその他のメソッドを介して新しいスレッドを作成します。
スレッドはクラスです。スレッド自体は、実行可能なインターフェイスを実装します。その声明は次のとおりです。
パブリッククラスのスレッド実装{}
スレッドの役割は、マルチスレッドを実現することです。
スレッドと実行可能な類似点と相違点:
スレッドと実行可能な類似性:両方とも「マルチスレッド実装方法」です。
スレッドと実行可能な違い:
スレッドはクラスであり、実行可能はインターフェイスです。スレッド自体は、実行可能なインターフェイスを実装するクラスです。 「クラスには1つの親クラスしか持てないが、複数のインターフェイスを実装できる」ことがわかっているため、Runnableのスケーラビリティが優れていることがわかっています。
さらに、Runnableは「リソースの共有」にも使用できます。つまり、特定の実行可能なオブジェクトに基づいて複数のスレッドが作成され、実行可能なオブジェクトでリソースを共有します。
一般的に、「Runnable」を介してマルチスレッドを実装することをお勧めします!
スレッドと実行可能のマルチスレッド例
1。スレッドのマルチスレッドの例
以下では、例を介してスレッドをよりよく理解し、実行可能なものをよりよく理解し、より説得力のあるオンラインの例を描くことができます。 // threadtest.javaソースコード
クラスMythreadはスレッドを拡張します{private int tieck = 10; public void run(){for(int i = 0; i <20; i ++){if(this.ticket> 0){system.out.println(this.getName()+"chootets:chootets"+thisict--); }}}}}}}; public class threadtest {public static void main(string [] args){// 3スレッドT1、T2、T3を開始します。各スレッドは10枚のチケットを販売しています! mythread t1 = new mythread(); mythread t2 = new mythread(); mythread t3 = new mythread(); t1.start(); t2.start(); t3.Start(); }}実行結果:
スレッド-0チケット販売:Ticket10Thread-1チケット販売:Ticket10Thread-2チケット販売:Ticket10Thread-1チケット販売:Ticket9THREAD-0チケット販売:Ticket8Thread-2チケット販売:Ticket9Thread-1チケット販売:チケット販売:チケット8thread-1チケット販売:チケット販売:チケット販売:チケット販売:チケット販売:チケット販売チケット販売:Ticket7Thread-1チケット販売:Ticket3Thread-0チケット:Ticket6Thread-1チケット:Ticket2Thread-2チケット:Ticket6Thread-2チケット:Ticket5THREAD-2チケット:Ticket4THREAD-1チケット:Ticket1THREAD-0チケット:Ticket5THREAD-2チケット:Ticket4ThRead-0チケット:チケット2チケット:Ticket2ThRead-0チケット:チケット-0チケット:チケット-0チケット:Ticket4Thread-0チケットチケット:ticket2thread-0チケット:ticket1thread-0チケット:ticket2thread-0チケット:ticket1
結果説明:
(1)Mythreadは、カスタムスレッドであるスレッドから継承されます。各Mythreadは10枚のチケットを販売しています。
(2)メインスレッドメインは、3つのMythread Childスレッドを作成して開始します。各チャイルドスレッドは10枚のチケットを販売しています。
2。Runnableのマルチスレッドの例
次に、上記のプログラムを変更します。 Runnableを介してインターフェイスを実装し、マルチスレッドを実装します。
// runnabletest.javaソースコードクラスMythread Runnable {private int tieck = 10; public void run(){for(int i = 0; i <20; i ++){if(this.ticket> 0){system.out.println(thread.currentthread()。 }}}}}; public class runnabletest {public static void main(string [] args){mythread mt = new mythread(); // 3つのスレッドT1、T2、T3を起動し(実行可能なオブジェクトを共有)、これらの3つのスレッドは合計10枚のチケットを販売しています!スレッドT1 =新しいスレッド(MT);スレッドT2 =新しいスレッド(MT);スレッドT3 =新しいスレッド(MT); t1.start(); t2.start(); t3.Start(); }}実行結果:
スレッド-0チケット販売:Ticket10thread-2チケット販売:Ticket8Thread-1チケット販売:Ticket9Thread-2チケット販売:Ticket6Thread-2チケット販売:Ticket4Thread-1チケット販売:Ticket5Thread-2チケット販売:Ticket2Thread-0チケット販売:Ticket3Thread-1チケット販売:Ticket1 Ticket1
結果説明:
(1)上記の「Mythreadはスレッドから継承する」とは異なります。ここで、Mythreadはスレッドインターフェイスを実装します。
(2)メインスレッドメインは3つの子スレッドを作成および開始し、これら3つの子スレッドはすべて「MT、実行可能オブジェクト」に基づいて作成されます。操作の結果、これらの3つの子スレッドは合計10枚のチケットを販売しました。これは、Mythreadインターフェイスを共有することを意味します。