CyclicBarrier和CountDownLatch 都位於java.util.concurrent 這個包下
一、CountDownLatch用法
CountDownLatch類只提供了一個構造器:
public CountDownLatch(int count) { }; //參數count爲計數值
然後下面這3個方法是CountDownLatch類中最重要的方法:
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
CountDownLatch, 一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。
下面舉個例子說明:
package main.java.CountDownLatch;
import java.util.concurrent.CountDownLatch;
/**
* PROJECT_NAME:downLoad
* Author:lucaifang
* Date:2016/3/18
*/
public class countDownlatchTest {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(5);
for(int i=0;i<5;i++){
new Thread(new readNum(i,countDownLatch)).start();
}
countDownLatch.await();
System.out.println("線程執行結束。。。。");
}
static class readNum implements Runnable{
private int id;
private CountDownLatch latch;
public readNum(int id,CountDownLatch latch){
this.id = id;
this.latch = latch;
}
@Override
public void run() {
synchronized (this){
System.out.println("id:"+id);
latch.countDown();
System.out.println("線程組任務"+id+"結束,其他任務繼續");
}
}
}
}
輸出結果:
id:1
線程組任務1結束,其他任務繼續
id:0
線程組任務0結束,其他任務繼續
id:2
線程組任務2結束,其他任務繼續
id:3
線程組任務3結束,其他任務繼續
id:4
線程組任務4結束,其他任務繼續
線程執行結束。。。。
線程在countDown()之後,會繼續執行自己的任務,而CyclicBarrier會在所有線程任務結束之後,纔會進行後續任務,具體可以看下面例子。
二、CyclicBarrier用法
CyclicBarrier提供2個構造器:
public CyclicBarrier(int parties, Runnable barrierAction) {
}
public CyclicBarrier(int parties) {
}
參數parties指讓多少個線程或者任務等待至barrier狀態;參數barrierAction爲當這些線程都達到barrier狀態時會執行的內容。
CyclicBarrier中最重要的方法就是await方法
public int await() throws InterruptedException, BrokenBarrierException { };//掛起當前線程,直至所有線程都到達barrier狀態再同時執行後續任務;
public int await(long timeout, TimeUnit unit)throws InterruptedException,BrokenBarrierException,TimeoutException { };//讓這些線程等待至一定的時間,如果還有線程沒有到達barrier狀態就直接讓到達barrier的線程執行後續任務
舉例說明
package main.java.countOff;
import java.util.concurrent.CyclicBarrier;
/**
* PROJECT_NAME:downLoad
* Author:lucaifang
* Date:2016/3/18
*/
public class cyclicBarrierTest {
public static void main(String[] args) throws InterruptedException {
CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
@Override
public void run() {
System.out.println("線程組執行結束");
}
});
for (int i = 0; i < 5; i++) {
new Thread(new readNum(i,cyclicBarrier)).start();
}
//CyclicBarrier 可以重複利用,
// 這個是CountDownLatch做不到的
// for (int i = 11; i < 16; i++) {
// new Thread(new readNum(i,cyclicBarrier)).start();
// }
}
static class readNum implements Runnable{
private int id;
private CyclicBarrier cyc;
public readNum(int id,CyclicBarrier cyc){
this.id = id;
this.cyc = cyc;
}
@Override
public void run() {
synchronized (this){
System.out.println("id:"+id);
try {
cyc.await();
System.out.println("線程組任務" + id + "結束,其他任務繼續");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
輸出結果:
id:1
id:2
id:4
id:0
id:3
線程組執行結束
線程組任務3結束,其他任務繼續
線程組任務1結束,其他任務繼續
線程組任務4結束,其他任務繼續
線程組任務0結束,其他任務繼續
線程組任務2結束,其他任務繼續