柵欄(java併發編程實戰5.5.4)

柵欄類似於閉鎖,它能阻塞一組線程直到某個事件發生。柵欄與閉鎖的關鍵區別在於,所有線程必須同時到達柵欄位置,

才能繼續執行。閉鎖用於等待事件,而柵欄用於等待其他線程,且能夠重複執行。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class TestCyclicBarrier {
	
	private final CyclicBarrier barrier;
	private final Worker[] workers;
	
	public TestCyclicBarrier() {
		int count = Runtime.getRuntime().availableProcessors();
		barrier = new CyclicBarrier(count, new Runnable() {
			@Override
			public void run() {
				System.out.println("所有線程均到達柵欄位置,開始下一輪");
			}
		});
		this.workers = new Worker[count];
		for(int i = 0; i < count; i++) {
			workers[i] = new Worker(i);
		}
	}

	private class Worker implements Runnable {
		int i;
		
		public Worker(int i) {
			this.i = i;
		}

		@Override
		public void run() {
			for(int index = 1; index < 3; index++) {
				System.out.println("線程" + i + "第" + index + "次到達柵欄位置,等待其他線程!");
				try {
					barrier.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				} catch (BrokenBarrierException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	
	public void start() {
		for(int i = 0; i < workers.length; i++) {
			new Thread(workers[i]).start();
		}
	}
	
	public static void main(String[] args) {
		new TestCyclicBarrier().start();
	}
	
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章