[解決済み】JavaマルチスレッドでCountDownLatchはどのように使用されるのですか?
質問
誰かJavaを理解するのを手伝ってくれませんか?
CountDownLatch
は、どのような場合に使用するのでしょうか?
このプログラムがどのように動作するのか、あまり明確には分かっていません。私の理解では、3つのスレッドが一度に開始され、各スレッドは3000ms後にCountDownLatchを呼び出すと思われます。だから、カウントダウンは1つずつデクリメントします。ラッチがゼロになった後、プログラムは "Completed"をプリントします。もしかしたら、私が理解した方法は間違っているかもしれません。
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class Processor implements Runnable {
private CountDownLatch latch;
public Processor(CountDownLatch latch) {
this.latch = latch;
}
public void run() {
System.out.println("Started.");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
}
}
// -----------------------------------------------------
public class App {
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(3); // coundown from 3 to 0
ExecutorService executor = Executors.newFixedThreadPool(3); // 3 Threads in pool
for(int i=0; i < 3; i++) {
executor.submit(new Processor(latch)); // ref to latch. each time call new Processes latch will count down by 1
}
try {
latch.await(); // wait until latch counted down to 0
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Completed.");
}
}
解決方法は?
はい、正しく理解されました。
CountDownLatch
はラッチの原理で動作し、メインスレッドはゲートが開くまで待機します。あるスレッドは
n
を作成する際に指定されたスレッド
CountDownLatch
.
を呼び出す任意のスレッド(通常はアプリケーションのメインスレッド)。
CountDownLatch.await()
は、count がゼロになるか、他のスレッドに割り込まれるまで待ちます。他のすべてのスレッドは、カウントダウンするために
CountDownLatch.countDown()
が完了するか、準備が整えば
カウントがゼロになると、待機中のスレッドは続行します。の欠点/長所のひとつは
CountDownLatch
は再利用ができない。
CountDownLatch
を追加しました。
編集する
使用方法
CountDownLatch
あるスレッド (メインスレッドなど) が処理を続ける前に、1 つ以上のスレッドの完了を待つ必要がある場合。
を使用する古典的な例です。
CountDownLatch
この場合、複数のサービスが複数のスレッドによって提供され、すべてのサービスが正常に開始されるまで、アプリケーションは処理を開始できません。
P.S. OPの質問にはかなりわかりやすい例があるので、1つも載せてません。
関連
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラー java.util.NoSuchElementException
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
[解決済み】ExecutorServiceを使用して、すべてのスレッドが終了するのを待つにはどうすればよいですか?