JAVA Semaphore實現信號燈

lSemaphore可以維護當前訪問自身的線程個數,並提供了同步機制。使用Semaphore可以控制同時訪問資源的線程個數,例如,實現一個文件允許的併發訪問數。
ØSemaphore實現的功能就類似廁所有5個坑,假如有十個人要上廁所,那麼同時能有多少個人去上廁所呢?同時只能有5個人能夠佔用,當5個人中的任何一個人讓開後,其中在等待的另外5個人中又有一個可以佔用了。
Ø另外等待的5個人中可以是隨機獲得優先機會,也可以是按照先來後到的順序獲得機會,這取決於構造Semaphore對象時傳入的參數選項。
l單個信號量的Semaphore對象可以實現互斥鎖的功能,並且可以是由一個線程獲得了“鎖”,再由另一個線程釋放“鎖”,這可應用於死鎖恢復的一些場合。

管理停車位,一個小的電子設備,實時性強就要semaphore

public class SemaphoreTest {
	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
		final  Semaphore sp = new Semaphore(3);
		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);			
		}
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章