工具
1.CountDownLatch
CountDownLatch類位於java.util.concurrent包下,利用它可以實現類似計數器的功能。比如有一個任務A,它要等待其他4個任務執行完畢之後才能執行,此時就可以利用CountDownLatch來實現這種功能了。
CountDownLatch類只提供了一個構造器:
1
|
public CountDownLatch( int count) { }; //參數count爲計數值
|
然後下面這3個方法是CountDownLatch類中最重要的方法:
1
2
3
|
public void await() throws InterruptedException { }; //調用await()方法的線程會被掛起,它會等待直到count值爲0才繼續執行
public boolean await( long timeout, TimeUnit unit) throws InterruptedException { }; //和await()類似,只不過等待一定的時間後count值還沒變爲0的話就會繼續執行
public void countDown() { }; //將count值減1
|
2.CyclicBarrier
字面意思迴環柵欄,通過它可以實現讓一組線程等待至某個狀態之後再全部同時執行。叫做迴環是因爲當所有等待線程都被釋放以後,CyclicBarrier可以被重用。我們暫且把這個狀態就叫做barrier,當調用await()方法之後,線程就處於barrier了。
CyclicBarrier類位於java.util.concurrent包下,CyclicBarrier提供2個構造器:
1
2
3
4
5
|
public CyclicBarrier( int parties, Runnable barrierAction) {
}
public CyclicBarrier( int parties) {
}
|
參數parties指讓多少個線程或者任務等待至barrier狀態;參數barrierAction爲當這些線程都達到barrier狀態時會執行的內容。
然後CyclicBarrier中最重要的方法就是await方法,它有2個重載版本:
1
2
|
public int await() throws InterruptedException, BrokenBarrierException { };
public int await( long timeout, TimeUnit unit) throws InterruptedException,BrokenBarrierException,TimeoutException { };
|
3.Semaphore
Semaphore翻譯成字面意思爲 信號量,Semaphore可以控同時訪問的線程個數,通過 acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。
Semaphore類位於java.util.concurrent包下,它提供了2個構造器:
1
2
3
4
5
6
|
public Semaphore( int permits) { //參數permits表示許可數目,即同時可以允許多少線程進行訪問
sync = new NonfairSync(permits);
}
public Semaphore( int permits, boolean fair) { //這個多了一個參數fair表示是否是公平的,即等待時間越久的越先獲取許可
sync = (fair)? new FairSync(permits) : new NonfairSync(permits);
}
|
下面說一下Semaphore類中比較重要的幾個方法,首先是acquire()、release()方法:
1
2
3
4
|
public void acquire() throws InterruptedException { } //獲取一個許可
public void acquire( int permits) throws InterruptedException { } //獲取permits個許可
public void release() { } //釋放一個許可
public void release( int permits) { } //釋放permits個許可
|
acquire()用來獲取一個許可,若無許可能夠獲得,則會一直等待,直到獲得許可。
release()用來釋放許可。注意,在釋放許可之前,必須先獲獲得許可。
這4個方法都會被阻塞,如果想立即得到執行結果,可以使用下面幾個方法:
1
2
3
4
|
public boolean tryAcquire() { }; //嘗試獲取一個許可,若獲取成功,則立即返回true,若獲取失敗,則立即返回false
public boolean tryAcquire( long timeout, TimeUnit unit) throws InterruptedException { }; //嘗試獲取一個許可,若在指定的時間內獲取成功,則立即返回true,否則則立即返回false
public boolean tryAcquire( int permits) { }; //嘗試獲取permits個許可,若獲取成功,則立即返回true,若獲取失敗,則立即返回false
public boolean tryAcquire( int permits, long timeout, TimeUnit unit) throws InterruptedException { }; //嘗試獲取permits個許可,若在指定的時間內獲取成功,則立即返回true,否則則立即返回false
|