転載、ブログのアドレスを記入してください
あなたがスターの私のgithubのプロジェクトAioSocketポイント、地域貢献のモチベーションにしてください助け場合、私は、ブログやgithubのアカウント
- 個人ブログ:https://www.cnblogs.com/haibiscuit/
- 個人githubの:https://github.com/haibiscuit?tab=repositories
コードをノックする人、鍵はシンプルで理解し、すべてのプログラマが行うことができないコードを維持しやすいが、良いパフォーマンスをノックアウト、鍵はピットの多くを避けるために、良い姿勢を見つけることです。
はい、今日の話は、適切な使用姿勢を待ってからのnotifyAllです。(前後の楽しみのJavaマルチスレッド(卓球競技)https://www.cnblogs.com/haibiscuit/p/11094348.html)
コードを投稿する前に、すべての最初は、手続規則のロジックについて話します:
1.6スレッド、実行+ 3の操作、実行3のスレッドのスレッド - 動作、および同時スレッド要件の同期を確保します
2.各糸ループn回の操作、デフォルト20
3.実行し、+ 20操作データを超えないようにしてください - 操作データが0未満であることができない場合
コードを投稿:
パッケージスレッド。
輸入java.util.concurrent.CountDownLatch。
/ **
* waitメソッドとエンティティクラスのオブジェクトに書き込む方法通知
*は、前者を解放するために別のスレッドによって呼び出され、オペレーティングエンティティオブジェクトを終了するのを待つロックが一時的に現在のスレッドの動作から撤退解放し、オブジェクトのメソッドを通知するために、現在のスレッドを表しスレッドは、オブジェクトに動作を継続する
* /
publicクラスAwaitTest {
パブリック静的無効メイン(文字列[] args)
{
;たCountDownLatchたCountDownLatch(6)=新しい新規たCountDownLatch
numberHolder =()numberHolder新しい新しいnumberHolder;
スレッド= T1新しい新しいIncreaseThread(numberHolderをたCountDownLatch);
スレッドT2 =新しい新しいDecreaseThread(numberHolder、たCountDownLatch);
スレッドT3 =新しい新しいIncreaseThread(numberHolder、たCountDownLatch);
スレッドT4 =新しい新しいDecreaseThread(numberHolder、たCountDownLatch);
スレッドT5 =新しい新しいIncreaseThread(numberHolder、たCountDownLatch);
スレッドT6 =新しいDecreaseThread(numberHolder、たCountDownLatch)。
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
{トライ
CountDownLatch.await();
System.out.printlnは( "実行のメインスレッドの終わり!");
}キャッチ(InterruptedExceptionあるE){
TODO自動生成されたブロック//キャッチ
e.printStackTrace();
}
}
}
NumberHolderクラス
{// **********非常に重要な
プライベートint型の数; //は、回数の数を増やすと、ここで同じの減少を実行するために実行し
、それ以外の場合は、スレッドがない限り、待機状態にあった可能性があり//次のように変更しながらIF
プライベートint型のI; //実行フラグの回数、テストクラスたCountDownLatch
(同期ボイドパブリックを高める)
{
ながら(数20 ==ある)//現在の数が、現在のスレッドのオブジェクトは、待機状態に入るときに10
{
試み
{
this.wait(500);
}
キャッチ(InterruptedExceptionあるE)
{
Eを.printStackTrace();
}
}
//本明細書で行うことができる説明を起こさなければならない
//数と0
の数++;
のSystem.out.println( "実行数" +(I ++));
のSystem.out.println(番号)
//スレッドを待機通知
this.notifyAll();
}
(同期ボイドパブリック)が減少
{
ながら(数が== 0)//現在のオブジェクトの数が待機状態に入る、ゼロに等しい
{
試み
{
; this.wait(500)
}
キャッチ(InterruptedExceptionあるE)
{
e.printStackTrace() ;
}
}
//ここに記載さを目覚めされるようにしている行うことができます
。//その数は0ではない
数;
System.out.printlnは(「実行回数」+(I ++));
System.out.printlnは(数);
これ。 notifyAll();
}
}
//スレッドクラス:以下のデータが追加されるのクラス制御エンティティ
クラスは、スレッドに延びIncreaseThread
{
プライベートNumberHolder numberHolder、
プライベートたCountDownLatchたCountDownLatchと、
公共IncreaseThread(NumberHolder numberHolder、たCountDownLatchたCountDownLatch)
{
this.numberHolder = numberHolder。
this.countDownLatch =たCountDownLatch。
}
@Override
公共ボイドRUN()
{
ため(; I 20は、<; I = 0 int型Iが++)
{
//特定の遅延を
試み
{
のThread.sleep((長く)Math.random()* 1000);
}
キャッチ(InterruptedExceptionあるE)
{
e.printStackTrace();
}
//操作が増加した実行
numberHolder.increase();
}
countDownLatch.countDown()。
}
}
//スレッドクラスは、操作エンティティクラス完了する
クラスは、スレッドに延びDecreaseThread
{
;プライベートNumberHolder numberHolder
たCountDownLatchたCountDownLatchをプライベートに、
公共DecreaseThread(NumberHolder numberHolder、たCountDownLatchたCountDownLatch)
{
this.numberHolder = numberHolder;
this.countDownLatch =たCountDownLatch;
}
@Override
公共ボイドRUN()
{
ため(; I 20は、<; I = 0 int型Iが++)
{
//特定の遅延を
試み
{
のThread.sleep((長く)Math.random()* 1000);
}
キャッチ(InterruptedExceptionあるE)
{
e.printStackTrace();
}
//リダクション演算実行
; numberHolder.decrease()
}
countDownLatch.countDown()を;
}
}
要約:
(組み合わせでの使用は推奨されていない場合)結合しながら、さらなる制限を使用する必要がある場合は、生体内の方法で同期するには1.wait
2.notifyAll()メソッドは、同期メソッド(推奨されないメソッドを通知する)内で使用する必要があります