乐趣区

关于java:突击并发编程JUC系列并发工具-Semaphore

突击并发编程 JUC 系列演示代码地址:
https://github.com/mtcarpenter/JavaTutorial

后面两个章节学习了 CountDownLatchCyclicBarrier,他们都是递加同步器,明天学习递增同步器 Semaphore
Semaphore(信号量)是用来管制同时拜访特定资源的线程数量,它通过协调各个线程,以保障正当的应用公共资源。看到这个信号量我的脑海中就呈现了红绿灯,为了保障学生的平安,学校的十字路口个别都设有红绿灯,车流量管制,每一次绿灯同时能通行 100 辆汽车,没有在绿灯通行的汽车都会被阻塞,直到下一次绿灯。

新日学校植树节流动,植树节地点中途必须通过一个红绿灯的十字路口,红绿灯的十字路口每次工夫无限,一次红绿灯的工夫只能通过两个年级的同学,示例如下:

public class SemaphoreExample1 {
    private final static int gradeNum = 6;

    private static Semaphore semaphore = new Semaphore(2);

    public static void main(String[] args) throws Exception {ExecutorService exec = Executors.newScheduledThreadPool(gradeNum);
        System.out.println("校门口红绿灯期待中.....");
        for (int i = 0; i < gradeNum; i++) {
            int gradeName = i + 1;
            exec.submit(() -> {
                try {
                    // 获取一个许可
                    semaphore.acquire();
                    wait(gradeName);
                    // 开释一个许可
                    semaphore.release();} catch (Exception e) {}});
        }
        exec.shutdown();}

    private static void wait(int gradeName) throws Exception {TimeUnit.SECONDS.sleep(1);
        System.out.println(gradeName + "年级通过红绿灯......");
    }
}

运行后果如下:

 校门口红绿灯期待中.....
1 年级通过红绿灯......
2 年级通过红绿灯......
4 年级通过红绿灯......
3 年级通过红绿灯......
5 年级通过红绿灯......
6 年级通过红绿灯......

大家运行此段代码会发现控制台,两个子线程同时打印。


欢送关注公众号 山间木匠, 我是小春哥,从事 Java 后端开发,会一点前端、通过继续输入系列技术文章以文会友,如果本文能为您提供帮忙,欢送大家关注、点赞、分享反对,_咱们下期再见!_

退出移动版