JUC 常用辅助类

JUC 常用辅助类

CountDownLatch减少计数

public class CountDemo {

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch cd = new CountDownLatch(6);

        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"\t号同学离开教室");
                cd.countDown();
            },String.valueOf(i)).start();
        }

        cd.await();
        System.out.println(
                Thread.currentThread().getName()+"\t班长离开教室"
        );
    }
}

CountDownLatch在初始化时传入一个数值,通过cd.countDown()可以将数值减去1,当数值减少到0时,cd.await()阻塞的线程就可以被释放。

CyclicBarrier循环栅栏

集齐龙珠召唤神龙

public class CylicDemo {

    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(7, () -> {
            System.out.println("召唤神龙");
        });
        for (int i = 0; i < 7; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+
                        "\t号龙珠收集成功");
                try {
                    barrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            },String.valueOf(i)).start();
        }
    }

}

在新建CyclicBarrier对象时可以传入一定的事务和等待的事务个数,当其他线程 barrier.await()被阻塞后,等待的事务个数减少1,当等待的事务减少为0时,主要事务执行。其他被阻塞的事务也就接着一起执行。

Semaphore信号灯

YY抢麦

public class SemphoreDemo {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3);
        for (int i = 0; i < 6; i++) {
            new Thread(()->{
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"\t车进入车位");
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println(Thread.currentThread().getName()+"\t车驶出车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }
    }
}

可以通过Semaphore来建立相应数量的资源来进行争抢,通过semaphore.acquire(); semaphore.release();来抢占和释放资源。可以用于多个共享资源的互斥使用,并发线程数量的控制

posted @ 2021-07-06 16:23  锤子布  阅读(48)  评论(0编辑  收藏  举报