信號量大家都不陌生引用百度百科上的解釋
信號量:在多線程環境下使用的一種設施,是可以用來保證兩個或多個關鍵代碼段不被併發調用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那麼該線程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。
下面學習一下concurrent包下的 Semaphore 類
舉個噁心的例子:蹲茅坑,現在有5個坑,有20個人在排隊等着5個坑,那麼只有等其中一個人上完了廁所以後,另外一個才能進去。
Semaphore 正是實現了這種功能。
import java.util.concurrent.*;
/**
*
* @author myemptyname
*
*/
public class TestSemaphore {
public static void main(String[] args) {
// 動態擴展線程池
ExecutorService exec = Executors.newCachedThreadPool();
// 只有5個茅坑
final Semaphore semp = new Semaphore(5);
// 20個人憋不住了
for (int index = 0; index < 20; index++) {
final int NO = index;
Runnable run = new Runnable() {
public void run() {
try {
//排隊看看有沒有空坑,有就進去
semp.acquire();
System.out.println(NO+"號上廁所: ");
Thread.sleep((long) (Math.random() * 10000));
// 上完了 舒服
semp.release();
System.out.println(NO+"出廁所");
System.out.println("現在有"+ semp.availablePermits()+"個茅坑");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
exec.execute(run);
}
// 退出線程池
exec.shutdown();
}
}