スレッド間通信の実装:
1:ファイル共有2:ネットワークシェア(共有ネットワークリソース)3:共有変数4:JDKは、スレッドコーディネーションAPIを提供する(待機/通知、公園/ unparkを)
1:ファイル共有:
同じファイルにデータを書き込み、読み込みの形で情報を共有します。
2:変数を共有:
書き込みと同じメモリオブジェクトの形を読み取ることでデータを共有。
3:コラボレーションスレッドAPI
マルチスレッドコラボレーション典型的な例:プロデューサコンシューマモデル。(主に実現して:スレッドがブロックされ、スレッドがウェイクアップ)
スレッド方法が推奨されていません
:一時停止と再開します。役割は、スレッドのスレッドを中断し、再開することです。
理由を放棄:デッドロックが簡単にコードを書くために(
ときハングスレッドロックを解除しない方法をサスペンド
)。
例:1:消費者が以前に保留されている場合は、ロックを得たが、生産者は、支出にデッドロックを消費者に知らせるためにキーを取得する必要があります。
2:履歴書をバックに、サスペンド、目の前に行われた場合。最初は、ウェイクアップ通知を発行したが、その後、それはウェイクアップの通知を受けたことがないハングアップし、受信しませんでした。
推奨の方法を用います
:
待機/和公園/ unparkを通知します。
通知/待つ:現在のスレッドが待機すること。
実際には、現在のスレッドを待機コレクションロックオブジェクトに追加し、廃棄オブジェクトされ、現在ロックを開催しました。あなたは(コードは同期コードブロック内で実行されるようにする)オブジェクトのロックを呼び出すために取得する必要があります
通知/のnotifyAll:ウェイクまたは待機中のすべてのスレッドがこのオブジェクトをロック覚まします。
注:1:
待機は、待機状態に入るためのスレッドがロックを解放する原因となります
。
しかし場合は、待機する前に実行通知します。また、スレッドは永遠に待つようになります。
2:waitメソッドは、モニターに基づいて実装されています。
公共 のボイド waitNotifyTest()スロー例外{ 新しい新しいスレッドを(() - > { //は待ち時間に、消費の条件を満たしていない ながら、(真の){ // これを決定するために使用されている間、スプリアスウェイクを防ぐために 同期(本){ 試み{ システム.out.println( "スレッドに、ウェイト。" ); この.WAIT(); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } } } System.out.println( "消費"); })スタート();. // 生産をシミュレートする、3秒の一時停止 のThread.sleep(3000 ); 同期(本){ // 消費者に通知し、待機するように終了させることができます。 この.notify(); } }
公園およびunparkを
公園およびunparkをメカニズムは、ライセンスメカニズムです。
コールパーク:待機ライセンス(ライセンスが既に存在する場合は、あなたが直接に取得することができます)。
unparkを呼び出す:指定されたスレッドのライセンスを提供します。
注:1:だから公園とunparkをを順に考慮されていません。原因があるかどうかを確認するだけのライセンスに。
2:公園ロックを解除しません。連動スレッドが駐車している場合。その後、他のスレッドがロックを取得することはありません。同期コードに注意を払うように、公園を利用します。
公共 のボイド parkUnparkTestは()スロー例外{ スレッドConsumerThreadを = 新しい新しいスレッド(() - > { ながら、(真の){ //はそれを決定するために使用されている間、スプリアスウェイクを防ぐために 、「消費条件を満たしていないのSystem.out.printlnを(に、スレッドを待ち" ); LockSupport.park(); // 現在のスレッドの状態を一時停止しますが、ロックを解除しないだろうに。 } }); consumerThread.start(); // 3秒オフ、アナログの生産が完了している生産。 Thread.sleep(3000 ); //は、消費者のスレッドに通知し、あなたが支出を開始することができます。 LockSupport.unpark(consumerThread)。
擬似ウェイク:
擬似ウェイクどのようなものです:スレッドがAPIを受信するためにウェイクアップコールではありませんが、本当の理由は、基礎となるのがよりにつながるはず。
CPUスケジューリングに、待機中のスレッドは、プログラムが基準を満たさなかった場合のスレッドが待機をアクティブにする、擬似ウェイクアップ受信することができます。あなたは裁きかのように、この時間を使用している場合。プログラムは直接、完了するまで実行されます。