/** * * @描述: Semaphore實現信號燈 . * Semaphore能夠維護當前訪問自身的線程個數,並提供了同步機制,使用Semaphore能夠控制同時訪問資源的線程個數,例如實現一個文件容許 * * 等待的線程能夠是隨機獲取優先機會,也能夠是按照先來後到的順序獲取機會,這取決於構造Semaphore對象時傳入的參數選項 * * 單個信號量的Semaphore對象能夠實現互斥的功能,而且能夠是由一個線程獲取了「鎖」,再由另外一個線程釋放「鎖」,這可應用於死鎖恢復的一些場合 * * 的併發訪問數 * @做者: Wnj . * @建立時間: 2017年5月16日 . * @版本: 1.0 . */ public class SemaphoreTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); //只能同時3我的進去 final Semaphore sp = new Semaphore(3); //有10我的要進去 for (int i = 0; i < 10; i++) { Runnable runnable = new Runnable() { public void run() { try { sp.acquire(); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println("線程" + Thread.currentThread().getName() + "進入,當前已有" + (3 - sp.availablePermits()) + "個併發"); try { Thread.sleep((long)(Math.random() * 50000)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("線程" + Thread.currentThread().getName() + "即將離開"); sp.release(); //下面代碼有時候執行不許確,由於其沒有和上面的代碼合成原子性 System.out.println("線程" + Thread.currentThread().getName() + "已經離開" + (3 - sp.availablePermits()) + "個併發"); } }; service.execute(runnable); } } }