Java之同步计数器CyclicBarrier

看下图,体会一下处理流程上的不同。

Java之同步计数器CyclicBarrier


package demo.thread;

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


public class ThreadMain {
	public static void main(String[] args) throws Exception {
		CyclicBarrier barrier = new CyclicBarrier(3, new TotalTask());
		BillTask worker1 = new BillTask("111", barrier);
		BillTask worker2 = new BillTask("222", barrier);
		BillTask worker3 = new BillTask("333", barrier);
		worker1.start();
		worker2.start();
		worker3.start();
		
		System.out.println("Main thread end!");
		
	}
	
	static class TotalTask extends Thread {
		public void run() {
			System.out.println("所有子任务都执行完了,就开始执行主任务了.");
		}
	}
	
	static class BillTask extends Thread {
		private String billName;
		private CyclicBarrier barrier;
		public BillTask(String workerName, CyclicBarrier barrier) {
			this.billName = workerName;
			this.barrier = barrier;
		}
		public void run() {
			try {
				System.out.println("市区: " + billName + "运算开始: ");
				Thread.sleep(1000L);
				System.out.println("市区: " + billName + "运算完成,等待中。。。");
				try {
					barrier.await();
				} catch (BrokenBarrierException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println("全部都结束, 市区 " + billName + "才开始后面的工作。");
			} catch(InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}


市区: 111运算开始: 
市区: 333运算开始: 
Main thread end!
市区: 222运算开始: 
市区: 222运算完成,等待中。。。
市区: 111运算完成,等待中。。。
市区: 333运算完成,等待中。。。
所有子任务都执行完了,就开始执行主任务了.
全部都结束, 市区 222才开始后面的工作。
全部都结束, 市区 111才开始后面的工作。
全部都结束, 市区 333才开始后面的工作。


上一篇:GPS定位系统源码GPS定位系统 GPSBD专为二次开发而设计


下一篇:java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)