线程使用CountDownLatch+CyclicBarrier+Semaphore

1、CountDownLatch:减法触发器,使用场景一个线程A需要等待线程B线程C都是达到条件(count=0)是才会执行。

2、CyclicBarrier:加法触发器屏障,(加法触发器)在每个线程都到达屏障点时触发。

3、Semaphore:控制同时访问的线程个数。

一、CountDownLatch代码如下:


线程使用CountDownLatch+CyclicBarrier+Semaphore_第1张图片

运行结果:


线程使用CountDownLatch+CyclicBarrier+Semaphore_第2张图片

结论:初始化执行要执行的任务数,count=0时触发执行主线程。

常用方法:

(1)public CountDownLatch(int count) {  };  //参数count为计数值------------------>构造方法,指定任务数

(2)public void await() throws InterruptedException { };  ----------------------->调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行.

(3)public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; ----------->和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行

(4)public void countDown() { };  //将count值减1

二、CyclicBarrier

字面意思是循环栅栏,可以让一组线程等待至某个状态之后全部执行。循环:CyclicBarrier是可以被重用。

代码如下:


线程使用CountDownLatch+CyclicBarrier+Semaphore_第3张图片

常用方法:

(1)public CyclicBarrier(int parties, Runnable barrierAction) {}-------->常用构造函器                parties:线程数        barrierAction:执行主线程                   public CyclicBarrier(int parties) {} -------------------------------->常用构造器

(2)public int await() throws InterruptedException, BrokenBarrierException { };---------->至barrier状态的方法                                                                    public int await(long timeout, TimeUnit unit)throws InterruptedException,BrokenBarrierException,TimeoutException { };这个是超时执行,如果超过指定的时间就会直接执行主线程。

(3)可重用性


线程使用CountDownLatch+CyclicBarrier+Semaphore_第4张图片

以上可以看出CyclicBarrier是可以重复使用的。而CounDownLatch是不支持的。

三、Semaphore

代码如下:


线程使用CountDownLatch+CyclicBarrier+Semaphore_第5张图片

常用方法:

(1)public Semaphore(int permits) {  sync = new NonfairSync(permits);}---------->构造器  参数是同时访问线程数                                                           public Semaphore(int permits, boolean fair) { sync = (fair)? new FairSync(permits) : new NonfairSync(permits);}------->fair:是否是公平的(等待时间越久越先获得许可)

(2)public void acquire() throws InterruptedException {  }-------------------->获取许可

(3)public void acquire(int permits) throws InterruptedException { }---------->获取permits个许可

(4)public void release(int permits) { }-------------------------->释放permits个许可

(5)public void release() { }------------------------------->释放一个许可

运行结果:


线程使用CountDownLatch+CyclicBarrier+Semaphore_第6张图片

个人总结:

1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过他们的侧重点不同;

CountDownLatch一般用于某个线程A等待若干个其他线程执行完成任务之后,它才执行

CyclicBarrier用于一组线程互相等待某个状态,然后一组线程再同时执行

Semaphore其实和锁有点像,一般用于控制对某组资源的访问权限。

2)CountDownLatch:是一个执行完成任务的线程数的 ------> 倒数计数器.(减法触发器)

2.1初始化计数器数 new CountDownLatch(3);-------->使用一个就减1 countDownLatch.countDown()------------>倒计数到0 自动唤醒  countDownLatch.awaut();

3)CyclicBarrier:加法计数器屏障。在每个线程中设置屏障点,当线程执行到屏障点就要停下---->计数器加1,------->计数器达到指定值------->所有线程全部执行

3.1 初始化计数器  new CyclicBarrier(count,new TestThread(){});------>运行-------->cyclicBarrier.await()挂起线程---------->计数器满足后执行TestThread(){}

------------------------------------------------比较---------------------------------------------------------

1.CountDownLatch 是把主线程挂起,在任务线程中进行倒数计数,直到任务线程执行完才唤醒主线程继续执行。

CyclicBarrier是把任务线程挂起,直到所有的任务线程执行到屏障处再放行继续执行。

2.CountDownLatch 达到屏障放行标准后放行的是主线程。

CyclicBarrier达到屏障放行标准后放行任务线程,并且还会额外的触发一个达到标准后执行的响应


源码请联系:[email protected]

你可能感兴趣的:(线程使用CountDownLatch+CyclicBarrier+Semaphore)