Java多线程的辅助类

55 阅读1分钟

CountDownLatch 就是一个减法计数器,它可以设置一个数量,等待指定数量线程数执行完毕再放开阻塞

主要方法: countDown数量-1 await等待计数器归0再放行

    public static void main(String[] args) throws InterruptedException {
        //总数是6个线程,必须6个线程都执行完了再关闭
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (Integer i = 1; i <= 6; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"执行完毕");
                //计数器-1
                countDownLatch.countDown();
            },String.valueOf(i)).start();
        }
        //等待计数器归零再向下执行
        countDownLatch.await();

        System.out.println("close,已关闭");
    }

CyclicBarrier 就是一个加法计数器,设置一个数量和一个方法A,当多个线程执行到一定数量的时候就会回调A方法

  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()+"颗龙珠");
                try {
                    //执行到7就执行声明时候指定的线程方法,并且放行
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                } catch (BrokenBarrierException e) {
                    throw new RuntimeException(e);
                }

            },String.valueOf(i)).start();
        }
        System.out.println("执行完毕");
    }

Semaphore(使用的非常多) 比如一个停车场有3个停车位,来了6辆车,先进来3辆停着,然后出去一个车再进来一个车,依次执行 一般实现限流使用

主要方法:

  1. acquier获取/得到,如果已经满了就等待有释放的再进入,其实就是信号量-1(减少一个车位)
  2. releas释放会让当前的信号量+1(有一个车位了)
public class SemaPhoreTest {
    public static void main(String[] args)  {
        //停车位数量,其实就是线程数量
        Semaphore semaphore = new Semaphore(3);

        for (int i = 1; i <= 6; i++) {
            new Thread(()->{
                try {
                    //acquier得到,就是抢到了车位
                    semaphore.acquire();

                    System.out.println(Thread.currentThread().getName()+"抢到了车位");
                    Thread.sleep(2000);
                    System.out.println(Thread.currentThread().getName()+"离开了车位");
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }finally {
                    //releas释放,释放车位
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }
    }
}