亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

突擊并發編程JUC系列-并發工具 Semaphore

標簽:
Java

> 突击并发编程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 后端开发,会一点前端、通过持续输出系列技术文章以文会友,如果本文能为您提供帮助,欢迎大家关注、 点赞、分享支持,我们下期再见!

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
JAVA開發工程師
手記
粉絲
1
獲贊與收藏
4

關注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消