多线程学习(八)Semaphore学习

匿名 (未验证) 提交于 2019-12-03 00:22:01

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是释放许可证的方法。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!