JUC-常用工具类使用

Semaphore 信号量

构造方法参数,指定信号量资源的总数

acquire方法,获得1个信号量资源,如果信号量满了,需要等待资源释放

release方法,释放1个信号量资源,然后通知其他等待的线程

常用于多个线程对同一个共享资源的互斥处理,可以做流量限流

代码示例:

6辆车,3个车位,抢车位

public class SemaphoreTest {

    public static void main(String[] args) {
        /**
         * 6辆车,3个停车位
          */
        Semaphore semaphore = new Semaphore(3);

        for (int i = 1; i <= 6 ; i++) {
            new Thread(()->{
                try {
                    // 获得停车位
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "号车获得停车位");
                    // 线程睡一秒
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println(Thread.currentThread().getName() + "号车离开停车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    // 释放资源
                    semaphore.release();
                }
            }, String.valueOf(i)).start();
        }
    }
}

CountDownLatch减法计数器

构造方法,指定计数器初始容量

countDown()方法,计数器容量减1

await()方法,等待技术器值归零,计数器归零之后,才能执行该代码后面的代码

public class CountDownLatchTest {

    public static void main(String[] args) throws InterruptedException {
        // 减法计数器,参数是int类型
        CountDownLatch countDownLatch = new CountDownLatch(6);

        for (int i = 1; i <= 6; i++) {
            new Thread(()-> {
                // 计数器执行减一操作
                System.out.println(Thread.currentThread().getName() + " go out");
                countDownLatch.countDown();
            }, String.valueOf(i)).start();
        }

        // 等待计数器归零,才能执行下面的代码
        countDownLatch.await();

        System.out.println("close door");
    }
}

CyclicBarrier加法计数器

构造方法,参数1指定需要达到的线程数量,参数二,Runnable接口实现类,如果达到了要求数量会执行Runnable接口中的run方法

await()方法,等待线程数量达到指定数量,达到之后,执行参数二中的业务

代码实现:

集齐七颗龙珠,召唤神龙

public class CyclicBarrierTest {

    public static void main(String[] args) {
        // 两个参数,参数1,指定需要达到线程数量,参数2,线程数量达到后,执行Runnable中的run方法
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, ()->{
            System.out.println("集齐七颗龙珠,召唤神龙");
        });

        for (int i = 1; i <= 7; i++) {
            final int temp = i;
            new Thread(()-> {
                System.out.println("集齐第一颗龙珠" + temp);
                try {
                    // 等到cyclicBarrier指定的线程数量达到7,就执行cyclicBarrier中指定写好的线程逻辑
                    cyclicBarrier.await();
                    System.out.println("没到7不会执行这里的代码");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

#JUC#
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务