至關於阻塞隊列同樣,semaphore至關於一個令牌許可,若是你設置了20個許可,則一次最多隻能同時併發20個線程。初始令牌爲0,每次執行一個線程,則acquire一個令牌,若是令牌不夠,則阻塞,當線程用完的時候,release掉一個令牌。下面是Demo:java
public static void main(String[] args) throws Exception { ExecutorService executorService = Executors.newCachedThreadPool(); Semaphore sem = new Semaphore(20); for (i = 0; i < 200; i++) { Runnable runnable = new Thread() { @Override public void run() { try { sem.acquire(); // 獲取令牌 System.out.printf("我拿到了令牌, 如今還剩下["+ sem.availablePermits() +"]\n"); Thread.sleep(2000); sem.release(); // 釋放令牌 } catch (InterruptedException e) { e.printStackTrace(); } } }; executorService.execute(runnable); } }