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

突擊併發編程JUC系列演示代碼地址: https://github.com/mtcarpenter/JavaTutorial前端

前面兩個章節學習了 CountDownLatchCyclicBarrier ,他們都是遞減同步器,今天學習遞增同步器 SemaphoreSemaphore(信號量)是用來控制同時訪問特定資源的線程數量,它經過協調各個線程,以保證合理的使用公共資源。看到這個信號量個人腦海中就出現了紅綠燈,爲了保證學生的安全,學校的十字路口通常都設有紅綠燈,車流量控制,每一次綠燈同時能通行 100 輛汽車,沒有在綠燈通行的汽車都會被阻塞,直到下一次綠燈。java

新日學校植樹節活動,植樹節地點中途必須經過一個紅綠燈的十字路口,紅綠燈的十字路口每次時間有限,一次紅綠燈的時間只能經過兩個年級的同窗,示例以下:git

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 + "年級經過紅綠燈......");
    }
}

運行結果以下:github

校門口紅綠燈等待中.....
1年級經過紅綠燈......
2年級經過紅綠燈......
4年級經過紅綠燈......
3年級經過紅綠燈......
5年級經過紅綠燈......
6年級經過紅綠燈......

你們運行此段代碼會發現控制檯,兩個子線程同時打印。編程


歡迎關注公衆號 山間木匠 , 我是小春哥,從事 Java 後端開發,會一點前端、經過持續輸出系列技術文章以文會友,若是本文能爲您提供幫助,歡迎你們關注、點贊、分享支持,咱們下期再見!<br />後端

相關文章
相關標籤/搜索