juc包下的四大工具类

本文详细介绍了Java并发编程中juc包的四大工具类:CountDownLatch、CyclicBarrier、Exchanger和Semaphore。CountDownLatch用于线程等待其他线程完成任务;CyclicBarrier可以重复使用,允许线程在特定条件达成后继续执行;Exchanger用于两个线程间的数据交换;Semaphore则作为信号量,限制同时访问特定资源的线程数量。
摘要由CSDN通过智能技术生成

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为需阻塞子线程个数
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值