1. 程式人生 > >JUC學習筆記(9)—Semaphore

JUC學習筆記(9)—Semaphore

在訊號量上我們定義兩種操作:acquire(獲取) 當一個執行緒呼叫acquire操作時,它要麼通過成功獲取訊號量(訊號量減1),
要麼一直等下去,直到有執行緒釋放訊號量,或超時。release(釋放)實際上會將訊號量的值加1,然後喚醒等待的執行緒。訊號量主要用於兩個目的,一個是用於多個共享資源的互斥使用,另一個用於併發執行緒數的控制。

public class SemaphoreDemo
{
	public static void main(String[] args)
	{
		Semaphore semaphore = new Semaphore(3);//模擬3個停車位
		
		for (int i = 1; i <=6; i++) //模擬6部汽車
		{
			new Thread(() -> {
				try 
				{
					semaphore.acquire();
					System.out.println(Thread.currentThread().getName()+"\t ***搶佔了車位");
					TimeUnit.SECONDS.sleep(new Random().nextInt(8));
					System.out.println(Thread.currentThread().getName()+"\t 離開了車位");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}finally {
					semaphore.release();
				}
			},String.valueOf(i)).start();
		}
		
	}
}