2017-03-01 6 views
1

私はCyclicBarrierについて傾いていて、私はこのデモを書いています。私はを期待通りにCyclicBarrierは最後に待っていますか?

import java.util.concurrent.BrokenBarrierException; 
import java.util.concurrent.CyclicBarrier; 
import static java.util.concurrent.ThreadLocalRandom.current; 
public class CyclicBarrierDemo { 
    public static void main(final String[] args) { 
     final int threads = 100; 
     final CyclicBarrier barrier 
      = new CyclicBarrier(threads,() -> System.out.println("tripped")); 
     final int rounds = 5; 
     for (int i = 0; i < threads; i++) { 
      new Thread(() -> { 
        for (int j = 0; j < rounds; j++) { 
         try { 
          Thread.sleep(current().nextLong(1000L)); 
          barrier.await(); 
         } catch (InterruptedException | BrokenBarrierException e) { 
          e.printStackTrace(System.err); 
          return; 
         } 
        } 
      }).start(); 
     } 
    } 
} 

プログラムは5 trippedを印刷し、終了し、

tripped 
tripped 
tripped 
tripped 
tripped 

私の質問は、最後のawait()が到着したときCyclicBarrierインスタンスは自身をリセットすることですか?出力が期待されるように?私はそれについて何の言葉も見つけられませんでした。

答えて

2

私の質問は、最後のawait()が到着したときにCyclicBarrierインスタンスがリセットされることです。

はい。そのインスタンスは、アプリケーションが何かをする必要がなくても再利用できるという意味でです。

出力が期待されるように?

はい

私はそのための任意の単語を見つけることができませんでした。

javadocによると、"このスレッドは、待機中のスレッドが解放された後に再利用できるため、周期的に呼び出されます。"

また、javadocに示されている例は、インスタンスが自身をリセットした場合にのみ説明したように動作します。 reset()への明示的な呼び出しはありません。 (さらに、バリアメソッドをjavadocで再利用したい場合は、reset()を明示的に呼び出すことは有効ではありません。

2

CyclicBarrierをゲートとして、車をスレッドとして考える

ゲート(バリア)は、その前に100台の車が待機するまで開かない。それが開くと、100台の車両のバッチが通過して再び閉じることができます。同じことが起こる(サイクリック)、それは通過することができます前に100台の車のバッチをもう一度待つでしょう。

+0

ありがとうございました。公式のapidocはそれを言及すべきである! –

+0

素敵な説明 – rvit34

関連する問題