(一)Java中的并发工具类

1.CountDownLatch

  • 允许一个或者多个线程等待其他线程完成操作
  • 相同功能的有Thread.join。但是countDownLatch的功能要比join功能强大
  • join用于让当前线程等待join线程执行完成,原理是不停的检查join现成话是否存活。如果存活,则让当前线程一直等待。wait(0)的就是一直等待。直到join线程结束后,线程的notifyAll会被调用。调用notifyAll是在JVM中实现的,JDK中看不到。
			while (isAlive()) {
                wait(0);
            }
  • countDownLatch可以实现join的功能。
//输出1 2 3
public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(2);
        new Thread(() -> {
            System.out.println(1);
            countDownLatch.countDown();
            System.out.println(2);
            countDownLatch.countDown();

        }).start();
        countDownLatch.await();
        System.out.println(3);
    }
  • countDownLatch的构造函数接收一个int参数作为计数器,如果想等待N个线程完成,那就传入N。在调用countDown()方法的时候,n会减1,countDownLatch.await()会阻塞线程,直到N为0.countDown()方法可以用在任何地方。
  • 如果有的线程处理的速度很慢,不可能让主线程一直处于等待的状态,可以使用指定时间的await(Long time, TimeUnit timeUnit);超过指定时间后,就不会阻塞线程。join也有类似的方法。
  • 计数器的数值必须大于0, 只是等于0的时候,不会阻塞线程。CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数器的值,一个线程调用countDown()方法happen benfore另一个线程调用await方法。

2、同步屏障CyclicBarrier

  • CyclicBarrier字面意思是循环使用的屏障。要做的事情就是让一组线程达到一个屏障(也可以叫做同步点)被阻塞。直到最后一个线程达到屏障时,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。
  • CyclicBarrier默认的构造方法CyclicBarrier(int parties);参数表示屏障拦截的线程数,每个线程调用await()方法来告诉CyclicBarrier我已经到达屏障,然后当前线程被阻塞。
public static void main(String[] args) throws InterruptedException {
        new Thread(()->{
            try {
                System.out.println("a");
                cyclicBarrier.await();
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(1);
        }).start();
        try {
            System.out.println("b");
            cyclicBarrier.await();
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println(2);
    }
  • 如果初始化数值为3,没有第三个线程执行await()方法,线程会被一直阻塞
  • 提供了一个高级的方法。CyclicBarrier(int parties, Runnable barrierAction) 当达到同步点的时候,优先执行barrierAction。方便除了更复杂的业务。CyclicBarrier应用于多线程计算,最后合并计算的场景。例如银行汇总计算等等。
  • CountDownLatch与CyclicBarrier之间的区别
    • CountDownLatch的计数器只可以使用一次,而CyclicBarrier可以使用reset方法重置。所以CyclicBarrier能处理更复杂的场景,例如若果计算出错,可以重置计数器重新执行一次
    • CyclicBarrier提供的方法
      • getNumberWaiting获得阻塞线程的数量
      • isBroken用来了解阻塞线程是否被中断

3.控制并发线程数的Semaphore

  • Semaphore(信号量)用来控制并发线程数,通过协调各个线程,保证合理的资源调用
  • 应用场景:流量控制;多线程并发时,控制最大访问资源的线程数。例如信号量为10,即使当前有30个线程并发请求,只允许10个线程执行并发。acquire()来获取许可证,release来释放许可证
  • 常用方法
    • reducePermits 减少许可证
    • getQueuedThreads 返回等待许可证的线程集合
    • int availablePermits() 返回信号量中可用的许可证数
    • int getQueueLength()返回正在等待许可证的线程数
    • boolean hasQueuedThreads() 是否有在等待许可证的线程

4.线程间交换数据的Exchanger

  • 交换者用于线程间协作的工具类。用于线程之间的数据交换。提供一个同步点,在这个同步点,两个线程之间可以交换彼此的数据。这两个线程通过exchange方法交换数据。如果第一个线程执行exchange()方法,会一直等待第二个线程也执行这个方法。当两个线程到达同步点,这两个线程就可以交换数据,将本线程产生的数据传递给对方。
  • 可以用作于遗传算法,也可以用作于校对工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值