CyclicBarrier是Java中java.util.concurrent并发包里的一个工具类。作用就是控制多个线程同时等待某个事件的执行才会一起执行。
使用场景:多用于多个子线程等待主线程执行完毕后执行的场景。
两个重要构造方法:
new CyclicBarrier(int)int为等待的线程的个数。
new CyclicBarrier(int,Runnable)Runnable为等待的线程被触发时,优先执行的线程。
主要api
await(),用于作用于线程等待,每执行一次await()方法int数减一,直到int减为0时,所有等待的线程将被触发执行。
实例模仿CyclicBarrier使用
package test;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.junit.Test;
public class TestCyclicBarrier implements Runnable{
CyclicBarrier barrier = new CyclicBarrier(4,this);
ExecutorService service = Executors.newCachedThreadPool();
@Test
public void test(){
service.submit(new Student1(barrier));
service.submit(new Student2(barrier));
service.submit(new Student3(barrier));
service.submit(new School(barrier));
}
public void run() {
System.out.println("老师提出问题!");
}
class Student1 implements Runnable{
CyclicBarrier barrier;
public void run() {
try {
barrier.await();
System.out.println("学生1抢答问题!");
}catch (Exception e) {
e.printStackTrace();
}
}
Student1(CyclicBarrier barrier){
this.barrier=barrier;
}
}
class Student2 implements Runnable{
CyclicBarrier barrier;
public void run() {
try {
barrier.await();
System.out.println("学生2抢答问题!");
}catch (Exception e) {
e.printStackTrace();
}
}
Student2(CyclicBarrier barrier){
this.barrier=barrier;
}
}
class Student3 implements Runnable{
CyclicBarrier barrier;
public void run() {
try {
barrier.await();
System.out.println("学生3抢答问题!");
}catch (Exception e) {
e.printStackTrace();
}
}
Student3(CyclicBarrier barrier){
this.barrier=barrier;
}
}
class School implements Runnable{
CyclicBarrier barrier;
public void run() {
try {
System.out.println("上课铃响");
barrier.await();
}catch (Exception e) {
e.printStackTrace();
}
}
School(CyclicBarrier barrier){
this.barrier=barrier;
}
}
}
运行结果: