JUC- 常用辅助类的使用

97 阅读1分钟

1. CountDownLatch

减法计数器 使一个线程等待其他线程各自执行完毕后再执行
  1. 指定一个计数器(计数6)new CountDownLatch(6)
  2. 每有一个线程执行就减一 countDownLatch.countDown();
  3. 当计数器归零后,唤醒所有await线程
class Driver {
    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i=1;i<7;i++)
        {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"go out");
                countDownLatch.countDown();
            },String.valueOf(i)).start();
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("close door");
    }
}

2. CyclicBarrier

加法计数器 允许一组线程全部等待彼此达到共同屏障点
  1. 指定一个加法计数器 CyclicBarrier cyclicBarrier = new CyclicBarrier(int,Runnalbe);

int == 共同屏障点(计数目标) Runnable == 到达屏障点后执行的线程操作

  1. 让一组线程等待 cyclicBarrier.await();

  2. 到达计数器数量int后,执行Runable

class Driver2 {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
            System.out.println("集齐龙珠,召唤神龙");
        });
        for (int i=1;i<=7;i++)
        {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"星龙珠,get");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }

    }
}
1星龙珠,get
4星龙珠,get
6星龙珠,get
5星龙珠,get
2星龙珠,get
3星龙珠,get
7星龙珠,get
集齐龙珠,召唤神龙

3. Semaphore

一个计数信号量 控制线程执行的数量

  1. 创建一个信号量 Semaphore semaphore = new Semaphore(3); 3代表允许执行的线程数量
  2. 获得 semaphore.acquire();
  3. 释放 semaphore.release();
class Driver3{
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3);
        for (int i=0;i<7;i++){
            new Thread(()->{

                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"come");
                    TimeUnit.SECONDS.sleep(2);
                    System.out.println(Thread.currentThread().getName()+"out");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }
    }
}