Semaphore是计数信号量,它管理了一定数量的许可证,每个线程要使用资源必须获得许可证,使用完了再释放许可证。当许可证被发放完了时,其他线程再想获得,必须等待,即进入了阻塞状态,当有线程释放了许可证时,它才能获得执行。
| 方法摘要 | |
|---|---|
| acquire()中断。 |
| 中断。 |
| acquireUninterruptibly() |
| |
| availablePermits() |
| drainPermits() |
| getQueuedThreads() |
| getQueueLength() |
| hasQueuedThreads() |
| isFair()true。 |
| |
| release() |
| |
| toString() |
| tryAcquire() |
| |
| 中断,则从此信号量获取给定数目的许可。 |
| 中断,则从此信号量获取一个许可。 |
比如某家餐厅只有五个餐桌,来了一百个人,每个人都想独占一张餐桌,这是就必须要等待有人吃完释放了餐桌,其他人才能吃,每次也只能有五个人同时吃,因为只有五张餐桌。
public class SemaphoreTest { public static void main(String[] args) { Semaphore semaphore = new Semaphore(5); for (int i = 0; i < 100; i++) { new Thread(new Runnable() { @Override public void run() { try { semaphore.acquire(); System.out.println(Thread.currentThread().getName()+"获取到餐桌!剩余餐桌数量:"+semaphore.availablePermits()); Thread.sleep(2000); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } } }执行结果:

其中,acquire方法是阻塞式的获取许可证的。release是释放许可证的方法。
文章来源: 多线程学习(八)Semaphore学习