3
下午好一切,Java的信号灯停止线程
我与Java的信号量和并发工作的一个学校项目,并有关于它是如何工作的几个问题!
如果没有可用的许可证,我需要该线程退出“队列” - 不只是睡觉,直到准备就绪。这可能吗?正如你可以在我的try, catch, finally
看 - 有没有处理此事件:
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + " aquired for 3 seconds " + semaphore.toString());
Thread.sleep(3000);
}
catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
System.out.println(Thread.currentThread().getName() + " released " + semaphore.toString());
}
丹尼尔带来了tryAquire
功能 - 这看起来不错,但我已阅读状态的教程,信号灯需要try, catch, finally
块,以防止死锁。我的当前代码(实现0)将在finally
块中发布,即使该线程从未获取。你有什么建议吗?
public void seatCustomer(int numBurritos) {
try {
if(semaphore.tryAcquire()) {
System.out.println(Thread.currentThread().getName() + " aquired for 3 seconds " + semaphore.toString());
Thread.sleep(3000);
} else {
System.out.println(Thread.currentThread().getName() + " left due to full shop");
}
}
catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
System.out.println(Thread.currentThread().getName() + " released " + semaphore.toString());
}
}
谢谢丹尼尔!这是我一直在玩,但我的try/catch/finally块释放从未获得的线程=/ –
我已更新我的答案,包括如何在finally块中处理它。 – Daniel
这是门票 - 非常感谢你的帮助@Daniel –