1、CountDownLatch:减法触发器,使用场景一个线程A需要等待线程B线程C都是达到条件(count=0)是才会执行。
2、CyclicBarrier:加法触发器屏障,(加法触发器)在每个线程都到达屏障点时触发。
3、Semaphore:控制同时访问的线程个数。
一、CountDownLatch代码如下:
运行结果:
结论:初始化执行要执行的任务数,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是可以被重用。
代码如下:
常用方法:
(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)可重用性
以上可以看出CyclicBarrier是可以重复使用的。而CounDownLatch是不支持的。
三、Semaphore
代码如下:
常用方法:
(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() { }------------------------------->释放一个许可
运行结果:
个人总结:
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]