java CyclicBarrier 同步器

java CyclicBarrier 同步器


import java.io.IOException;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * <pre>
 * CyclicBarrier
 * 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。
 * 
 * Semaphore, CountDownLatch, CyclicBarrier和Exchanger
 * 
 * 假设有只有的一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,
 * 才一起出发,只要有一个人没有准备好,大家都等待.
 * </pre>
 * 
 */
class Runner implements Runnable {

	private CyclicBarrier barrier;

	private String name;

	public Runner(CyclicBarrier barrier, String name) {
		super();
		this.barrier = barrier;
		this.name = name;
	}

	public void run() {
		try {
			Thread.sleep(new Random().nextInt(2000));
			System.out.println(name + " 准备OK.");
			// System.out.println("当前线程:"+(barrier.getNumberWaiting()+1));
			barrier.await();
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			e.printStackTrace();
		}
		System.out.println(name + " Go!!");
	}
}

public class CyclicBarrierTest2 {

	public static void main(String[] args) throws IOException, InterruptedException {
		CyclicBarrier barrier = new CyclicBarrier(4);

		ExecutorService executor = Executors.newFixedThreadPool(4);
		executor.submit(new Thread(new Runner(barrier, "zhangsan")));
		executor.submit(new Thread(new Runner(barrier, "lisi")));
		executor.submit(new Thread(new Runner(barrier, "wangwu")));
		executor.submit(new Thread(new Runner(barrier, "zhaoliu")));

		executor.shutdown();
	}
}

结果:

wangwu 准备OK.
lisi 准备OK.
zhaoliu 准备OK.
zhangsan 准备OK.
zhangsan Go!!
wangwu Go!!
lisi Go!!
zhaoliu Go!!


import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CyclicBarrierTest {

	public static void main(String[] args) {

		final CyclicBarrier barrier = new CyclicBarrier(10, new Runnable() {
			public void run() {
				System.out.println("大部队集合完毕了。");
				try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

		});

		ExecutorService executor = Executors.newFixedThreadPool(10);
		for (int i = 0; i < 10; i++) {
			final int num = i;
			executor.execute(new Runnable() {
				public void run() {
					System.out.println("num: " + num + " 从公司出发了.");
					try {
						Thread.sleep(new Random().nextInt(1000));
						barrier.await(); // 在西湖等待大部队

						System.out.println("num: " + num + " 在西湖开始游玩.");

						Thread.sleep(new Random().nextInt(2000));
						barrier.await(); // 等待大部队就餐
					} catch (Exception e1) {
					}
				}
			});
		}

		executor.shutdown();
	}
}
结果:

num: 0 从公司出发了.
num: 2 从公司出发了.
num: 1 从公司出发了.
num: 8 从公司出发了.
num: 6 从公司出发了.
num: 5 从公司出发了.
num: 4 从公司出发了.
num: 9 从公司出发了.
num: 3 从公司出发了.
num: 7 从公司出发了.
大部队集合完毕了。
num: 6 在西湖开始游玩.
num: 1 在西湖开始游玩.
num: 2 在西湖开始游玩.
num: 3 在西湖开始游玩.
num: 0 在西湖开始游玩.
num: 4 在西湖开始游玩.
num: 7 在西湖开始游玩.
num: 8 在西湖开始游玩.
num: 5 在西湖开始游玩.
num: 9 在西湖开始游玩.
大部队集合完毕了。


你可能感兴趣的:(java CyclicBarrier 同步器)