併發包Semaphore實現信號燈

/**
 * 
 * @描述: 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);
        }
    }
    
}
相關文章
相關標籤/搜索