この記事では、主に、次のように、Javaの並行性の従来のスレッド同期通信技術の関連コード例を研究しています。
最初に質問を見てみましょう:
2つのスレッドがあります。子スレッドは最初に10回実行され、次にメインスレッドが5回実行され、その後、子スレッドに切り替えて10が実行され、メインスレッドは5回実行されます...この往復は50回です。
この質問を読んだ後、スレッド間の通信が使用されていることは明らかです。最初にアイデアを分析させてください。最初に2つのスレッドが必要です。次に、各スレッドに50のループが必要です。各スレッドは往復50倍のタスクを実行する必要があり、メインスレッドのタスクは5回実行することであり、子スレッドのタスクは10回実行することです。スレッド間通信テクノロジーは、主にwait()メソッドとnotify()メソッドを使用します。 wait()メソッドにより、現在のスレッドが待機してロックが保持されます。 notify()メソッドは、このオブジェクトモニターを待っている単一のスレッドが目覚めていることを示しています。このスレッド間通信の問題を段階的に完了しましょう。
まず、メインスレッドとチャイルドスレッド間の通信に関係なく、各スレッドで実行されるタスクを作成します。
Public Class TraditionalThreadCommunication {public static void main(string [] args){//子スレッドを開くnew runnable(){@override public void run(){for(int i = 1; i <= 50; i ++){synchronized(criditionalthreadcommunication.class){= 10; j = 1; {system.out.println( "" +j +"のサブスレッドシーケンス、" +i);}}}}}) {system.out.println( "" + j + "のメインスレッドシーケンス、" + i);}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}上記のように、2つのスレッドにはそれぞれ50の大きなループがあり、50のタスクを実行し、子スレッドのタスクは10回実行され、メインスレッドのタスクは5回実行されます。 2つのスレッド間の同期を確保するために、同期化された同期コードブロックが使用され、同じロックが使用されます:クラスのバイトコードオブジェクト。これにより、スレッドの安全性が保証されます。しかし、このデザインはあまり良くありません。前のセクションのデッドロックに書いたように、スレッドタスクをクラスに入れることができます。この設計のパターンはより構造化されており、同じクラスに異なるスレッドタスクを使用すると、クラスで同じロックを使用できるため、同期の問題が簡単に解決できます。したがって、上記のプログラムを変更します。
Public Class TraditionalThreadCommunication {public static void main(string [] args){business business = new Business(); // new a thread task processing class // new runnable(){@override public void run(){for(int i = 1; i <= 50; i ++){bussines.sub(i)スレッド(int i = 1; i <= 50; i ++){bussiness.main(i);}}} //共通データ(同期ロックを含む)または使用するいくつかの一般的な方法は、同じクラスに分類する必要があります。このデザインは、高級クラスタリングプログラムの堅牢性を反映しています。 class business {public synchronized void sub(int i){for(int j = 1; j <= 10; j ++){system.out.println( "" +j +"のサブスレッドシーケンス、" +i);}} public synchronized void main(int i){for j = 1; j <= 5; j ++) j + "、" + i);}}のループこの変更の後、プログラム構造はより明確で堅牢になります。同期されたキーワードを2つのスレッドタスクメソッドに追加し、このロックを使用するだけです。しかし、2つのスレッドの間にはまだ通信がありません。実行の結果、メインスレッドはタスクを50回ループし、チャイルドスレッドはタスクを50回ループアウトします。同期した同期があるため、その理由は非常に簡単です。
以下は、質問に記載されている2つのスレッド間の通信を可能にするために、プログラムを改善し続けています。
Public Class TraditionalThreadCommunication {public static void main(string [] args){business business = new Business(); // new a thread task processing class // new runnable(){@override public void run(){for(int i = 1; i <= 50; i ++){bussines.sub(i) (int i = 1; i <= 50; i ++){bussiness.main(i);}}}} //のスレッド(同期ロックを含む)またはいくつかの一般的な方法を使用するには、同じクラスに分類する必要があります。このデザインは、Gao Leiドラマとプログラムの堅牢性を反映しています。 class Business {private boolean bshouldsub = true; public synchronized void sub(int i){while(!bshouldsub){//実行する順番ではない場合は、{this.wait();ここで同期はメソッドにあるので、これを使用して} catch(arternedexception e){// dodo auto-feenated catch blocke.printstacktrace();}} for(int j = 1; j <= 10; j ++){system.out.println( "サブスレッドシーケンス" + j + " + i); this.notify(); //メインスレッドを起動している} public synchronized void main(int i){while(bshouldsub){//実行する方向がない場合は、{this.wait();} catch(interruptedexception e){// todo auto-jerated catch blocke.printstacktrace() ++){system.out.println( "" + j + "のメインスレッドシーケンス、" + i);} bshouldsub = true; // tag this.notify(); //待機中の子スレッドを覚ます}}}}まず、特定のプログラムの実装については、構造的な観点からは、この設計の利点をすでに実現しています。メイン関数の何も変更する必要はなく、スレッド間同期とスレッド間コミュニケーションに関する論理はすべてビジネスクラスです。メイン関数内の異なるスレッドは、クラスに配置された対応するタスクを呼び出すだけです。それは高い群れの利点を反映しています。
特定のコードをもう一度見てみましょう。まず、ブール変数を定義して、実行するスレッドを識別します。それが子供の糸ではないとき、それは眠ります。その後、メインスレッドを自然に実行します。実行後、BshouldSubを変更し、子スレッドを目覚めさせます。この時点で、子の糸は満足せず、眠らないと判断します。子スレッドタスクを実行します。同様に、メインスレッドがBshouldSubを変更したばかりの後、2番目のループを使用してメインスレッドタスクを実行すると、眠り、子スレッドが目覚めるのを待ちます。これにより、ロジックが非常に明確になります。メインスレッドとチャイルドスレッドは、それぞれのタスクを実行するために交代で、このリズムは合計で50倍です。
別の小さな説明があります。実際には判断する場合は使用することが可能ですが、なぜWhenを使用するのですか?時々、スレッドはファイクリーを目覚めさせるからです(それは夢遊病のようで、明らかに眠っているが立ち上がっています)。 IFを使用する場合、それが目覚めた後、それは裁判官に戻ることはありません、そして、それはタスクを自然に実行します。さて、別のスレッドが実行されているため、フラッシュ中の別のスレッドに影響します。しかし、しばらくすると、異なるでしょう。スレッドが誤って目を覚ましていても、それでもなお判断します。ただし、この時点で他のスレッドが実行されています。 BshouldSubは変更されていないため、再び眠っている間にまだ入り、再び眠っています。これは、公式のJDKドキュメントでも行われます。
スレッド間の通信を要約しましょう。
上記は、Javaの並行性の従来のスレッド同期通信テクノロジーコードのすべての詳細な説明であり、すべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!