Pausing a Threadの例を参照してください。通知の代わりにnotifyAll
を使用した場合、副作用があり、必要ですか?notifyAllを使用してスレッドを再開する
答えて
この例では、待機中のスレッドが1つしかないため、違いはありません。
notify
とnotifyAll
の違いは、1人ではなくすべてのウェイターが復帰することです。
もう1つ注目すべきは、notify()では、どのスレッドが起きたかを制御できないということです。これは選択された任意のスレッドです。ですから、優先度を偏向させる必要がある場合は、java.util.concurrentのより高度な実装を探す必要があります。 – berry120
複数の当事者がオブジェクトを待つことができる場合は、通知ではなくnotifyAllを使用することが重要です。 1つのスレッドだけが待っていれば、notifyとnotifyAllを呼び出す間に違いはありません。 「効果的なJavaの」項目69に
、ブロッホは「はいつものnotifyAllを使用する」を示唆しています。
新しい実行可能ファイルを作成します。 runメソッド "start"では、countdownlatchが待機しており、あらかじめ定義された時間、そのラッチのcountdownを呼び出して解放されない限り、実行は許可されません。この場合1.(開始は同時のnoとして1を渡すので)
//改訂された回答。 //実行可能クラス。
public class WorkerThread implements Runnable
{
CountDownLatch start;
CountDownLatch end;
String name;
WorkerThread(CountDownLatch startLatch, CountDownLatch stopLatch)
{
this.start = startLatch;
this.end = stopLatch;
}
public void run()
{
try
{
start.await();
} catch (InterruptedException ex)
{
ex.printStackTrace();
}
System.out.println("Will run when start is released ");
end.countDown();
}
}
//ワーカースレッドを実行するエントリポイントメソッドです。
public void initiateProcess (final int count) {
CountDownLatch start = new CountDownLatch(1);
CountDownLatch stop = new CountDownLatch(count);
for (int i = 0; i < count; i++)
{
new Thread(new WorkerThread(start, stop))
.start();
}
System.out.println("Go");
// This is where start latch is released. Now worked thread can complete its function.
start.countDown();
try
{
// Stop will wait until stop latch is countdowned to zero from count param. (see count param)
stop.await();
} catch (InterruptedException ex)
{
ex.printStackTrace();
}
System.out.println("Finished");
}
スレッドを一時停止および再開する方法は正確には表示されません。 –
うーん...あなたはおそらく正しいです、私は急いで小さなラッチサンプルを投稿していました。私は答えを改訂しました。 –
このクラスをコピーし、デバッガモードで実行してください。カウントダウンをよく理解するのに役立ちます。 –
- 1. スレッドnotifyAll()
- 2. notifyAll()not working、notifyAllどのようにソケットプログラミングのすべてのスレッド
- 3. Javaスレッドnotify()とnotifyAll()
- 4. ArrayListを使用したIllegalMonitorStateException NotifyAll()Wait()
- 5. waitとnotifyAllを使用するとJavaプログラムがフリーズします
- 6. 別のスレッドからスレッドを一時停止して再開するC#
- 7. 再開C#のスレッド
- 8. キーを押してスレッドを一時停止して再開する
- 9. フラグを使用してスレッド内のアクションを再開するにはどうすればよいですか?
- 10. Javaクラスを使用してスレッドのリストを開始した後で、終了したスレッドを特定して再起動する方法はありますか?
- 11. 既存のスレッドは、新しいスレッドを使用して新しいスレッドを作成します()。)(開始
- 12. スレッドモジュールpythonスレッドの停止と再開スレッド
- 13. 公開JPAを使用してエンティティを再作成する
- 14. sambaを使用してアップロードを再開する
- 15. OOPメソッドを使用してキャンバスアニメーションを再開する
- 16. AndroidでORMLiteを使用して接続を再開する
- 17. cocos2dのアラートビューを使用してゲームシーンを再開する方法
- 18. キープレスを使用して実行を再開する
- 19. Jquery(Html5ビデオ要素)を使用してビデオを再開する
- 20. メッセージボックス(yes/no)を使用してゲームを再開する
- 21. スレッドの中断と再開
- 22. スレッドの休止/再開
- 23. notifyAllはスレッドを呼び起こさない
- 24. エグゼキュータを使用してもスレッドを開始できません
- 25. jboss5スレッドプールを使用してスレッドを開始
- 26. C++スレッドとしてスレッドを使用
- 27. アプリケーションを再開したときにサービスを使用して音楽を再開する
- 28. スレッドを使用して次の曲をMPRemoteCommandCenterで再生する方法
- 29. スケジュールの後にスレッドを再開()
- 30. スクリプトを開始して再開する
私は脱退していることは知っていますが、並行性ユーティリティを使用して待機して通知する方が優れています。 –
@ doc_180を実行してから、並行性ユーティリティを使用してスレッドを一時停止および再開するための一般的な方法を示してください。 –
あなたはDoug Leaの本の同時性に関する読書より悪いことになります。とにかくここでは簡単なエグゼキュータとラッチのサンプルがあります。下の別の答えのコードサンプル。 –