【发布时间】:2015-09-30 07:25:55
【问题描述】:
大家下午好,
我正在为一个学校项目使用 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());
}
}
【问题讨论】:
标签: java multithreading concurrency semaphore