java 并发辅助类

2022-12-15  本文已影响0人  arkliu

CountDownLatch(减法计数器)

CountDownLatch是一个同步工具类,用来协调多个线程之间的同步
CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。

// 初始化一个计数器为5
CountDownLatch latch = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
    new Thread(()->{
        System.out.println(Thread.currentThread().getName()+" runs..");
        latch.countDown(); // 计数减1
    },"线程"+i).start();
}
latch.await(); // 阻塞等待计数为0,才会继续向后执行
System.out.println("countdown num is 0...");

CountDownLatch缺点:
CountDownLatch是一次性的,计算器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用

CyclicBarrier

CyclicBarrier cyclicBarrier = new CyclicBarrier(7, ()->{
    System.out.println("7个线程都执行完了...");
});
for (int i = 0; i < 7; i++) {
    final int tmp = i;
    new Thread(()->{
        System.out.println(Thread.currentThread().getName()+" get..."+tmp);
        try {
            cyclicBarrier.await();
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
    },"线程"+i).start();
}
image.png

Semaphore信号量

作用:多个共享资源互斥使用,控制最大线程数

// 3个停车位
Semaphore semaphore = new Semaphore(3);
// 6个线程
for (int i = 0; i < 6; i++) {
    final int tmp = i;
    new Thread(()->{
        try {
            semaphore.acquire(); //得到
            System.out.println(Thread.currentThread().getName()+" 找到了车位");
            TimeUnit.SECONDS.sleep(2);
            System.out.println(Thread.currentThread().getName()+" 离开了车位");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            semaphore.release(); // 释放
        }
    },"线程"+i).start();
}
image.png
上一篇 下一篇

猜你喜欢

热点阅读