Semaphore可以維護當前訪問自身的線程個數,並提供了同步機制,使用Semaphore可以控制同時訪問資源的線程數,例如,實現一個檔案允許的並發訪問數. Semaphore實現的功能就類似廁所一共有5個茅坑(new Semaphore(5)),加入有10個人(10個線程)要上廁所,那麼同時只能有5個人能夠佔用,當佔用的5個人任何一個讓開後(release()方法),其中等待的另外5個人中又有一個可以佔用了(acquire()方法). 另外等待的5個人可以是隨機擷取優先機會,也可以是按照先來後到的順序擷取機會,這取決於構造方法傳入的參數選項.public Semaphore(int permits, boolean fair) 單個訊號量的Semaphore對象可以實現互斥鎖的功能,並且可以是由一個線程獲得鎖,再由另外一個線程釋放鎖,也就是一個線程可以去釋放鎖,儘管他沒有得到permit,這可以應用死結恢複的一些場合.public class SemaphoreTest {
public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final Semaphore sp = new Semaphore(3,true); 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() * 10000)); } 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); }
}
轉載請註明出處: http://blog.csdn.net/johnny901114/article/details/8695717