我們之前分享了一個同步工具CountDonwLatch,它的作用是當一定線程執行完之後,才執行後面代碼
======相關鏈接====
對CountDownLatch感興趣的同學請點擊達拉然傳送門
而CyclicBarrier的功能是當指定的所有線程處於同一個狀態時,同時執行後序代碼,我們看下面的例子
public class CyclicBarrierDemo {
public static void main(String[] args) {
Runnable runnable1 = new Runnable() {
Thread thread = Thread.currentThread();
@Override
public void run() {
System.out.println("thread:"+thread.currentThread().getName()+" start,state:"+thread.getState());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread:"+thread.currentThread().getName()+" end,state:"+thread.getState());
}
};
Runnable runnable2 = new Runnable() {
Thread thread = Thread.currentThread();
@Override
public void run() {
System.out.println("thread:"+thread.currentThread().getName()+" start,state:"+thread.getState());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread:"+thread.currentThread().getName()+" end,state:"+thread.getState());
}
};
Thread thread1 = new Thread(runnable1);
Thread thread2 = new Thread(runnable2);
Thread thread3 = new Thread(runnable1);
thread1.start();
thread2.start();
thread3.start();
}
}
打印結果:
首先打印出
thread:Thread-0 start,state:TERMINATED
thread:Thread-2 start,state:TERMINATED
thread:Thread-1 start,state:TERMINATED
thread:Thread-2 end,state:TERMINATED
thread:Thread-0 end,state:TERMINATED
過了一會又打印出
thread:Thread-1 end,state:TERMINATED
這個結果大家可以試一下,那麼現在我們要求3個線程要同時輸出end語句,這就要用到了CyclicBarrier
我們看下面代碼
public class CyclicBarrierDemo {
public static void main(String[] args) {
//構造cyclicBarrier,入參count爲 觸發後序代碼的線程數
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
Runnable runnable1 = new Runnable() {
Thread thread = Thread.currentThread();
@Override
public void run() {
System.out.println("thread:"+thread.currentThread().getName()+" start,state:"+thread.getState());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//在此等待其他線程
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread:"+thread.currentThread().getName()+" end,state:"+thread.getState());
}
};
Runnable runnable2 = new Runnable() {
Thread thread = Thread.currentThread();
@Override
public void run() {
System.out.println("thread:"+thread.currentThread().getName()+" start,state:"+thread.getState());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//在此等待其他線程
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread:"+thread.currentThread().getName()+" end,state:"+thread.getState());
}
};
Thread thread1 = new Thread(runnable1);
Thread thread2 = new Thread(runnable2);
Thread thread3 = new Thread(runnable1);
thread1.start();
thread2.start();
thread3.start();
}
}
這次我們可以看到,所有end語句同時打印
這裏要說明的是CyclicBarrier的構造方法還有一個是傳入count 和 runnable的,如果選擇此構造方法,在執行後序代碼之前,先要執行傳入的runnable的run方法代碼