JUC 常用的三个辅助类

CountDownLatch

测试:

public class CountDownLatchDemo {

    // 测试计数器
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 1; i <=10; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName());
                countDownLatch.countDown();
            },String.valueOf(i)).start();
        }
//        countDownLatch.await();
        System.out.println("关门 -> ");

    }
}

打印:

关门 -> 
1
10
9
7
6
8
2
4
3
5

CountDownLatch可以当作是一个计数器,核心方法如下:

1、countDownLatch.countDown(); 计数初值减一

2、countDownLatch.await(); 当计数器变为0,countDownLatch.await() 就会被唤醒,继续执行程序!

cyclicBarrier

// 加法计数器
public class CyclicBarrierDemo {

    public static void main(String[] args) {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
            System.out.println("计数完成");
        });

        for (int i = 1; i <= 7; i++) {
            int finalI = i;
            new Thread(() -> {
                try {
                    System.out.println("第 " + String.valueOf(finalI) + "个");
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }, Thread.currentThread().getName()).start();
        }
    }

}

cyclicBarrier.await() 方法会让 CyclicBarrier 一直等待, 当线程数量达到阈值的时候就会触发。
下面是 CyclicBarrier 的构造函数, 第二个参数为Runable 接口, 可以使用 lambda 表达式来写

public CyclicBarrier(int parties, Runnable barrierAction) {
    this.lock = new ReentrantLock();
    this.trip = this.lock.newCondition();
    this.generation = new CyclicBarrier.Generation();
    if (parties <= 0) {
        throw new IllegalArgumentException();
    } else {
        this.parties = parties;
        this.count = parties;
        this.barrierCommand = barrierAction;
    }
}

Semaphore

public class SemaphoreDemo {
    // 控制最大的线程数量
    public static void main(String[] args) {

        // 最大执行3个 线程
        Semaphore semaphore = new Semaphore(3);

        /**
         * 1、         semaphore.acquire(); 获得, 在满的情况下, 会等待, 等待释放位置
         * 2、         semaphore.release(); 释放,会将当前的信号量释放 + 1,然后唤醒等待的线程!
         * 作用: 多个共享资源互斥的使用!并发限流,控制大的线程数
         */
        for (int i = 1; i <= 6; 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();
                    // 释放
                }
            }, String.valueOf(i)).start();
        }
    }
}

你可能感兴趣的:(JUC 常用的三个辅助类)