三個併發編程中的輔助類
CountDownLatch
主要實現類似計數器的功能,比方說共有N個工作線程,主線程需要等待N個工作線程都完成之後才能繼續運行,類似這樣的場景就可以用到CountDownLatch。
主要有兩個方法:countDown和await。開始時初始化一個CountDownLatch,並初始化計數值,該對象作爲一個共享變量對每個關注的線程可見,每個工作線程完成之後調用countDown將計數器減一,然後繼續後續的工作。主線程則調用await阻塞等待至計數器爲0,然後再繼續後面的工作。
CountDownLatch使用一次後不能重複使用。這是與後面的CyclicBarrier區別的地方,後者可以重用。
CyclicBarrier
也稱迴環柵欄,該工具的作用是對併發工作的N個線程,保證每個線程在工作到某個特定的狀態之後停下來,直到所有的N的線程都到達了指定的狀態,再分別各自開始運行。
使用方式上,先是生成一個共享的CyclicBarrier對象,並初始化關注N個對象;然後在N個線程中的某個指定的狀態之後調用CyclicBarrier的await。
另外CyclicBarrier是可以重用的。
Semaphore
也稱信號量,應用在控制某類資源最多同時被訪問的數量的場景。初始化時設置最多的同時訪問者數量,
主要方法:
public void acquire() throws InterruptedException { } //獲取一個許可
public void acquire(int permits) throws InterruptedException { } //獲取permits個許可
public void release() { } //釋放一個許可
public void release(int permits) { } //釋放permits個許可
上述是阻塞版本,還有非阻塞版本這裏就不提了。