CyclicBarrier 高并发的使用

CyclicBarrier是Java中java.util.concurrent并发包里的一个工具类。作用就是控制多个线程同时等待某个事件的执行才会一起执行。

使用场景:多用于多个子线程等待主线程执行完毕后执行的场景。

两个重要构造方法:

new CyclicBarrier(intint为等待的线程的个数。 
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;
        }
    }
}

运行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/CSDNzhangtao5/article/details/63695710