我们之前分享了一个同步工具CountDonwLatch,它的作用是当一定线程执行完之后,才执行后面代码
======相关链接====
对CountDownLatch感兴趣的同学请点击达拉然传送门
而CyclicBarrier的功能是当指定的所有线程处于同一个状态时,同时执行后序代码,我们看下面的例子
public class CyclicBarrierDemo {
public static void main(String[] args) {
Runnable runnable1 = new Runnable() {
Thread thread = Thread.currentThread();
@Override
public void run() {
System.out.println("thread:"+thread.currentThread().getName()+" start,state:"+thread.getState());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread:"+thread.currentThread().getName()+" end,state:"+thread.getState());
}
};
Runnable runnable2 = new Runnable() {
Thread thread = Thread.currentThread();
@Override
public void run() {
System.out.println("thread:"+thread.currentThread().getName()+" start,state:"+thread.getState());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread:"+thread.currentThread().getName()+" end,state:"+thread.getState());
}
};
Thread thread1 = new Thread(runnable1);
Thread thread2 = new Thread(runnable2);
Thread thread3 = new Thread(runnable1);
thread1.start();
thread2.start();
thread3.start();
}
}
打印结果:
首先打印出
thread:Thread-0 start,state:TERMINATED
thread:Thread-2 start,state:TERMINATED
thread:Thread-1 start,state:TERMINATED
thread:Thread-2 end,state:TERMINATED
thread:Thread-0 end,state:TERMINATED
过了一会又打印出
thread:Thread-1 end,state:TERMINATED
这个结果大家可以试一下,那么现在我们要求3个线程要同时输出end语句,这就要用到了CyclicBarrier
我们看下面代码
public class CyclicBarrierDemo {
public static void main(String[] args) {
//构造cyclicBarrier,入参count为 触发后序代码的线程数
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
Runnable runnable1 = new Runnable() {
Thread thread = Thread.currentThread();
@Override
public void run() {
System.out.println("thread:"+thread.currentThread().getName()+" start,state:"+thread.getState());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//在此等待其他线程
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread:"+thread.currentThread().getName()+" end,state:"+thread.getState());
}
};
Runnable runnable2 = new Runnable() {
Thread thread = Thread.currentThread();
@Override
public void run() {
System.out.println("thread:"+thread.currentThread().getName()+" start,state:"+thread.getState());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//在此等待其他线程
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread:"+thread.currentThread().getName()+" end,state:"+thread.getState());
}
};
Thread thread1 = new Thread(runnable1);
Thread thread2 = new Thread(runnable2);
Thread thread3 = new Thread(runnable1);
thread1.start();
thread2.start();
thread3.start();
}
}
这次我们可以看到,所有end语句同时打印
这里要说明的是CyclicBarrier的构造方法还有一个是传入count 和 runnable的,如果选择此构造方法,在执行后序代码之前,先要执行传入的runnable的run方法代码