Semaphore 的使用,看了 api 后,我觉得就一个值得注意的,那就是:信号量通常用于限制线程数,而不是访问某些(物理或逻辑)资源
使用示例代码如下:
@Test
public void SemaphoreTest() throws Exception {
CountDownLatch countDownLatch = new CountDownLatch(10);
// 3 个工作人员
Semaphore semaphore = new Semaphore(3, true);
ExecutorService service = Executors.newFixedThreadPool(10);
// 10 顾客
for (int i = 0; i < 10; i++) {
service.execute(() -> {
try {
System.out.println(Thread.currentThread().getName() + " 顾客来到指定受理地点");
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + " 工作人员对顾客事件进行处理");
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName() + " 该顾客事件处理完毕,下一位顾客");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
countDownLatch.countDown();
}
});
}
service.shutdown();
countDownLatch.await();
}