信號量可以同時允許多個線程進入臨界資源區。
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);
}
}
}