信號量,Semaphore

信號量可以同時允許多個線程進入臨界資源區。

  • new Semaphore(int permits) //構造函數中指定允許的線程數量
  • acquire() release() 分別表示獲取信號量准許和釋放准許
public class SemaphoreDemo implements Runnable {

	final Semaphore semp = new Semaphore(5);
	
	
	
	@Override
	public void run() {
		try {
			//當前線程獲取信號量,獲取一個准入許可
			semp.acquire(); 
			Thread.sleep(1000);
			System.out.println(Thread.currentThread().getId() + ":done!");
			//當前線程釋放信號量,釋放一個准入許可。如果沒有釋放,能進入臨界區的線程會越來越少
			semp.release();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		ExecutorService exe = Executors.newFixedThreadPool(20);
		final SemaphoreDemo demo = new SemaphoreDemo();
		//因爲信號量限制了進入臨界區的線程數量,20個線程會5個一組輸出打印字符串
		for (int i = 0; i < 20; i++) {
			exe.submit(demo);
		}
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章