java多線程之Semaphore

Semaphore(信號量)是用來控制同時訪問特定資源的線程數量,它通過協調各個線程,以
保證合理的使用公共資源。

1. 應用場景

Semaphore可以用于做流量控制,特別是公用資源有限的應用場景,比如數據庫連接。假
如有一個需求,要讀取幾萬個文件的數據,因為都是IO密集型任務,我們可以啟動幾十個線程
并發地讀取,但是如果讀到內存后,還需要存儲到數據庫中,而數據庫的連接數只有10個,這
時我們必須控制只有10個線程同時獲取數據庫連接保存數據,否則會報錯無法獲取數據庫連
接。這個時候,就可以使用Semaphore來做流量控制

2. 示例

    public static void main(String[] args) throws Exception {
        Semaphore semaphore = new Semaphore(3);
        for (int i = 0; i< 20; i++) {
            new Thread( ()-> {
                try {
                    semaphore.acquire();
                    log.info("線程: {} 開始執行", Thread.currentThread().getName());
                    Thread.sleep(2000);
                    log.info("線程: {} 執行結束", Thread.currentThread().getName());
                    semaphore.release();
                } catch (Exception e) {}
            }, "線程" + i).start();
        }
    }

打印結果如下圖:


image.png
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容