1. 程式人生 > >java Smaphore 控制並發線程數

java Smaphore 控制並發線程數

並發 out 同事 但是 save exec sta pub exception

概念:

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

應用場景:

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

package com.test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreTest { private static final int THREAD_COUNT = 30; private static ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_COUNT); private static Semaphore s = new Semaphore(10);
public static void main(String[] args) { for (int i = 0; i < THREAD_COUNT; i ++) { threadPool.execute(new Runnable() { @Override public void run() { try { s.acquire(); System.out.println(
"save DATA:" + System.currentTimeMillis()); s.release(); } catch (Exception e) { e.printStackTrace(); } } }); } threadPool.shutdown(); } }

java Smaphore 控制並發線程數