我在代码中使用了ArrayBlockingQueue
。客户端将等待,直到元素变得可用:
myBlockingQueue.take();
如果队列中没有元素并且 take()
无限期地等待元素变得可用,我如何“关闭”我的服务?此方法会引发 InterruptedException
。我的问题是,如何“引发”中断异常以便 take()
退出? (我也对 notify()
持怀疑态度,但似乎我在这里没有帮助..)
我知道我可以插入一个特殊的“EOF/QUIT”标记元素,但这真的是唯一的解决方案吗?
更新(关于评论,它指向另一个有两个解决方案的问题):
上面提到的一个使用“毒丸对象”,第二个是Thread.interrupt()
:
myBlockingQueue.take()
不在Thread
(扩展线程)中使用,而是实现Runnable
。 Runnable 似乎没有提供 .interrupt()
方法?
如何中断Runnable
?
最佳答案
你可以像这样实现Runnable。 (它假设您在尝试中断 Runnable 之前已经启动了它)
class MyRunnable implements Runnable {
private Thread thisThread;
public void run() {
thisThread = Thread.currentThread();
try {
// do some work
} catch(Throwable t) {
t.printStackTrace(); // or log the error.
}
}
public void interrupt() {
thisThread.interrupt();
}
}
关于java - ArrayBlockingQueue - 如何 "interrupt"正在等待 .take() 方法的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2979055/