2017-03-01 50 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 

我的問題是,CyclicBarrier實例自行復位,當到達最後await()?這樣的產量預計?我找不到任何文字。

回答

2

我的問題是CyclicBarrier實例在最後一次await()到達時重置自身嗎?

是的。從某種意義上說,這個實例可以被重用,而不需要應用程序來做某件事。

因此預計產量?

我無法找到任何詞語。

javadoc說:「屏障被稱爲循環,因爲它可以在等待線程被釋放後重新使用。」

此外,javadoc中顯示的示例只有在實例重置自身時纔會如所述那樣工作。請注意,沒有明確的電話reset()。 (此外,如果您想根據方法的javadoc重複使用屏障,則不清楚明確調用reset()是有用的。)

2

將CyclicBarrier看作門和汽車線程。

大門(障礙)不會打開,直到它看到100輛汽車在它前面等待。當它打開時,它將只允許批量的100輛車通過並再次關閉。同樣的事情會發生(循環),它會等待一批100輛車再次通過。

+0

謝謝。官方apidoc應該提到這一點! –

+0

很好的解釋 – rvit34