回答

11

A CyclicBarrier是循環的,因爲它可以重新使用而不需要重新設置。從Javadoc

一個同步輔助它允許一組線程的所有等待 彼此達成共同屏障點。在涉及固定大小的線程組的程序中,循環邊界是有用的,其中 偶爾等待對方。由於 這個屏障被稱爲cyclic它可以在等待線程被釋放之後重新使用。

所以在正常使用情況下,一旦所有的線程都被收集起來並且障礙物被破壞,它就會重置並重新使用。

Javadoc for reset()

將屏障重置爲其初始狀態。如果任何一方當前在屏障上等待 ,他們將返回 BrokenBarrierException。請注意,發生破損後重置 由於其他原因可能會複雜地執行;線程需要以其他方式重新同步 ,並選擇一個來執行重置。 對於後續的 使用,可能會更好地爲其創建新的屏障。

所以reset導致任何目前等待的線程拋出一個BrokenBarrierException並立即醒來。當你想「打破」障礙時使用reset

還要注意警告 - 一旦線程被強制喚醒,很難再次同步它們。

TL; DR:在正常情況下,您永遠不需要使用reset()

+0

「tricky」是什麼意思?這是來自javadoc的同一個詞,我不明白。這是否意味着在處理破損(由'reset()'引起)的中間時重新同步屏障是困難的,然後其他一些線程來到它並要求屏障? – Leo