我在閱讀CyclicBarrier
在以下鏈接 http://java-latte.blogspot.in/2013/10/cyclicbarrier-in-java-concurrency.html。何時重置Java多線程中的CyclicBarrier
在示例1中,CyclicRaceDemo.java
的主要方法,CyclicBarrier正在重新使用,而不調用復位方法。
我跑了這個例子,它工作正常。所以,我想知道reset
方法有什麼用處。什麼時候該被叫?或者我們需要調用它嗎?
我在閱讀CyclicBarrier
在以下鏈接 http://java-latte.blogspot.in/2013/10/cyclicbarrier-in-java-concurrency.html。何時重置Java多線程中的CyclicBarrier
在示例1中,CyclicRaceDemo.java
的主要方法,CyclicBarrier正在重新使用,而不調用復位方法。
我跑了這個例子,它工作正常。所以,我想知道reset
方法有什麼用處。什麼時候該被叫?或者我們需要調用它嗎?
A CyclicBarrier
是循環的,因爲它可以重新使用而不需要重新設置。從Javadoc
一個同步輔助它允許一組線程的所有等待 彼此達成共同屏障點。在涉及固定大小的線程組的程序中,循環邊界是有用的,其中 偶爾等待對方。由於 這個屏障被稱爲cyclic它可以在等待線程被釋放之後重新使用。
所以在正常使用情況下,一旦所有的線程都被收集起來並且障礙物被破壞,它就會重置並重新使用。
將屏障重置爲其初始狀態。如果任何一方當前在屏障上等待 ,他們將返回
BrokenBarrierException
。請注意,發生破損後重置 由於其他原因可能會複雜地執行;線程需要以其他方式重新同步 ,並選擇一個來執行重置。 對於後續的 使用,可能會更好地爲其創建新的屏障。
所以reset
導致任何目前等待的線程拋出一個BrokenBarrierException
並立即醒來。當你想「打破」障礙時使用reset
。
還要注意警告 - 一旦線程被強制喚醒,很難再次同步它們。
TL; DR:在正常情況下,您永遠不需要使用reset()
。
「tricky」是什麼意思?這是來自javadoc的同一個詞,我不明白。這是否意味着在處理破損(由'reset()'引起)的中間時重新同步屏障是困難的,然後其他一些線程來到它並要求屏障? – Leo