大家下午好,
我正在为学校项目使用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());
}
Daniel提到了tryAquire
函数 - 这看起来很不错,但我读过的教程都说信号量需要一个try, catch, finally
块来防止死锁。我的当前代码(实现了tryAquire
)将在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());
}
}