線程同步之CyclicBarrier

我們之前分享了一個同步工具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方法代碼




發佈了65 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章