java ArrayBlockingQueue如何“中断”正在等待的线程。take()方法
我在代码中使用了ArrayBlockingQueue
。客户端将等待元素变为可用:
myBlockingQueue.take();
如果队列中没有元素,并且take()
无限期地等待某个元素可用,我如何“关闭”我的服务?此方法抛出一个InterruptedException
。我的问题是,如何“调用”中断的异常,以便take()
退出?(我也对notify()
感到困惑,但似乎我在这里帮不上忙……)
我知道我可以插入一个特殊的“EOF/QUIT”标记元素,但这真的是唯一的解决方案吗
更新(关于该评论,它指向另一个问题,有两种解决方案):
上面提到的一个是使用“毒丸对象”,第二个是Thread.interrupt()
:
myBlockingQueue.take()
不是在Thread
(扩展线程)中使用,而是实现Runnable
。Runnable似乎不提供.interrupt()
方法
我怎样才能中断Runnable
# 1 楼答案
最简单的方法是保留用于运行runnable的线程的引用,并在关机时中断它
或者,您可以使用线程池来组织服务的线程。然后线程池负责跟踪和管理线程,包括在关闭时中断线程
还有一种(不推荐的)方法是枚举JVM中所有正在运行的线程(使用ThreadGroup的方法),并尝试猜测哪个线程运行您的runnable(例如,通过分析每个线程的堆栈)
# 2 楼答案
找到解决方案:
如问题中所述,使用“中毒物体”
或
使用
this.interrupt()
中断线程eitehr,或者如果它是可运行的,则使用Thread.currentThread().interrupt();
# 3 楼答案
您可以像这样实现Runnable。(假设您在尝试中断Runnable之前已启动它)