juc包下的四大工具类
CountDownLatch
CyclicBarrier
Exchange
Semaphore
1.CountDownLatch–闭锁
作用为:解决一个线程需等待其他线程完成任务后再次恢复执行的情景。
注意:每个CountDownLatch对象的计数器在减为0时不可恢复原值。
CountDownLatch类常用方法:
//调用await()方法的线程阻塞直到其他线程完成任务才可恢复执行
1.public void await() throws InterruptedException {
}
//await()方法的重载方法,作用为等待timeout时间后无论其他线程是否完成任务均恢复执行
2.public boolean await(long timeout, TimeUnit unit) throws InterruptedException {
}
//CountDownLatch类唯一的构造方法,count为需要等待完成任务线程数量
3.public CountDownLatch(int count) {
}
//该方法为兵法执行任务的线程调用,调用countDown方法相当于已执行完任务,count--,直到count=0时最初调用await()方法的阻塞线程才可恢复执行
4.public void countDown() {
}
假想一个这样的场景:运动场上,裁判一声哨响,运动员起跑,裁判开始计时,等待最后一位运动员到达终点时裁判才可按下计时器,结束比赛。那么也就是说裁判要等到所有运动员都到达终点后才可按下计时器。那这个场景我们要怎么实现呢?使用之前多线程部分的知识,我们很容易就能想到join()方法,假想裁判是主线程,运动员均是子线程,使用join()方法就需要在所有子线程在主线程中调用join()方法,但线程在调用join()方法的先后顺序上也可能影响运行结果。
针对以上场景,我们可用CountDownLatch完美解决:
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
class CountDownLatchTest implements Runnable{
private CountDownLatch countDownLatch;
public CountDownLatchTest(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"到达终点");
countDownLatch.countDown();
}
}
public class ThreadTest{
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch=new CountDownLatch(3);
System.out.println("比赛开始...");
new Thread(new CountDownLatchTest(countDownLatch),"运动员A").start();
TimeUnit.SECONDS.sleep(2);
new Thread(new CountDownLatchTest(countDownLatch),"运动员B").start();
TimeUnit.SECONDS.sleep(2);
new Thread(new CountDownLatchTest(countDownLatch),"运动员C").start();
countDownLatch.await();
System.out.println("所有运动员均到达终点,比赛结束!");
}
}
/*
比赛开始...
运动员A到达终点
运动员B到达终点
运动员C到达终点
所有运动员均到达终点,比赛结束!
*/
CountDownLatch图示:
2.CyclicBarrier–循环栅栏
注意:每个CyclicBarrier对象可重复使用。
CyclicBarrier常用方法:
//parties为需阻塞子线程个数