JUC學習筆記(9)—Semaphore
阿新 • • 發佈:2019-01-04
在訊號量上我們定義兩種操作: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(); } } }