package com.test; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; /** * 在TestThread的基础上,为CyclicBarrier 加入runnable * 在写完前,可以做其他事 * @author Joy */ public class TestThread2 { public static void main(String[] args) { int N = 4; CyclicBarrier barrier = new CyclicBarrier(N,new Runnable() { @Override public void run() { System.out.println("当前线程"+Thread.currentThread().getName()); } }); for(int i=0;i<N;i++) new Writer(barrier).start(); /*for(int i=0;i<N;i++) { if(i<N-1) new Writer(barrier).start(); else { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } new Writer(barrier).start(); } }*/ } static class Writer extends Thread{ private CyclicBarrier cyclicBarrier; public Writer(CyclicBarrier cyclicBarrier) { this.cyclicBarrier = cyclicBarrier; } @Override public void run() { System.out.println("线程"+Thread.currentThread().getName()+"正在写入数据..."); try { Thread.sleep(5000); //以睡眠来模拟写入数据操作 System.out.println("线程"+Thread.currentThread().getName()+"写入数据完毕,等待其他线程写入完毕"); cyclicBarrier.await(); System.out.println("线程"+Thread.currentThread().getName()+"在await后面"); //cyclicBarrier.await(2000, TimeUnit.MILLISECONDS);//await指定时间,故意让其中一个线程拖延时间 } catch (InterruptedException e) { e.printStackTrace(); }catch(BrokenBarrierException e){ e.printStackTrace(); } /*catch (TimeoutException e) { // TODO Auto-generated catch block e.printStackTrace(); }*/ System.out.println("所有线程写入完毕,继续处理其他任务..."); } } }