フェンス(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();
	}
	
}