【學習筆記】Java-Concurrent-Semaphore
阿新 • • 發佈:2018-11-09
同時只有一個人可以吃麵包的示例
/** * 第一個執行緒 與第二個同時執行 */ public static void firstThread0(Context context) throws Exception{ while(true) { eatBread(context); Thread.sleep(1000); //每吃一個麵包休息一秒 } } /** * 第二個執行緒 */ public static void secondThread0(Context context) throws Exception{ while(true) { eatBread(context); Thread.sleep(1000); } } public static void eatBread(Context context) throws Exception { //請求分配一個麵包 context.breadDispatcher.acquire(1); log("我吃了一個麵包"); //把座位還回去 context.breadDispatcher.release(); } public static void log(String args){ System.out.println(Thread.currentThread().getName() + "\t" + new Date() + "\t" + args); } public static class Context { //這裡使用一個遵守FIFO規則的Semaphore //來看看cpu時間片的分配演算法會讓誰先吃到第一個麵包 public Semaphore breadDispatcher = new Semaphore(1, true); public Context() { } }
執行結果:
Thread-1 Mon Nov 05 15:46:08 CST 2018 我吃了一個麵包
Thread-0 Mon Nov 05 15:46:08 CST 2018 我吃了一個麵包
Thread-1 Mon Nov 05 15:46:09 CST 2018 我吃了一個麵包
Thread-0 Mon Nov 05 15:46:09 CST 2018 我吃了一個麵包
用途:
1.為容器設定邊界
2.設定同時執行某個操作的最大執行緒數量
常用函式
//if(還有許可證) 取走許可證 else 阻塞等待可用許可證
public void acquire() throws InterruptedException
//歸還一個許可證
public void release()