Java ArrayBlockingQueue-如何;中断“;等待.take()方法的线程
我在代码中使用Java ArrayBlockingQueue-如何;中断“;等待.take()方法的线程,java,concurrency,Java,Concurrency,我在代码中使用ArrayBlockingQueue。客户端将等待元素变为可用: myBlockingQueue.take(); 如果队列中没有元素,并且take()无限期地等待元素可用,我如何“关闭”服务?此方法引发一个中断异常。我的问题是,如何“调用”中断的异常,以便take()退出?(我也谈到了notify(),但似乎我在这里帮不上忙……) 我知道我可以插入一个特殊的“EOF/QUIT”标记元素,但这真的是唯一的解决方案吗 更新(关于该评论,它指向另一个问题,有两种解决方案): 上面提到的
ArrayBlockingQueue
。客户端将等待元素变为可用:
myBlockingQueue.take();
如果队列中没有元素,并且take()
无限期地等待元素可用,我如何“关闭”服务?此方法引发一个中断异常
。我的问题是,如何“调用”中断的异常,以便take()
退出?(我也谈到了notify()
,但似乎我在这里帮不上忙……)
我知道我可以插入一个特殊的“EOF/QUIT”标记元素,但这真的是唯一的解决方案吗
更新(关于该评论,它指向另一个问题,有两种解决方案):
上面提到的一个是使用“毒药丸对象”,第二个是Thread.interrupt()
:
myBlockingQueue.take()
在线程
(扩展线程)中不使用而实现Runnable
。Runnable似乎不提供.interrupt()
方法
如何中断可运行的?找到了解决方案:
如问题中所述,使用“中毒物体”
或
使用this.Interrupt()
中断线程eitehr,或者如果它是可运行的,则使用Thread.currentThread().Interrupt()代码>找到了解决方案:
如问题中所述,使用“中毒物体”
或
使用this.Interrupt()
中断线程eitehr,或者如果它是可运行的,则使用Thread.currentThread().Interrupt()代码>您可以像这样实现Runnable。(假设您在尝试中断Runnable之前已启动它)
您可以像这样实现Runnable。(假设您在尝试中断Runnable之前已启动它)
最简单的方法是保留用于运行runnable的线程的引用,并在关机时中断它
或者,您可以使用线程池来组织服务的线程。然后线程池负责跟踪和管理线程,包括在关闭时中断线程
还有一种(不推荐的)方法是枚举JVM中所有正在运行的线程(使用ThreadGroup的方法),并尝试猜测哪个线程运行您的runnable(例如,通过分析每个线程的堆栈).最简单的方法是保留用于运行runnable的线程的引用,并在关机时中断它
或者,您可以使用线程池来组织服务的线程。然后线程池负责跟踪和管理线程,包括在关闭时中断线程
另一种(不推荐的)方法是枚举JVM中所有正在运行的线程(使用ThreadGroup的方法),并尝试猜测哪个线程运行您的可运行线程(例如,通过分析每个线程的堆栈)。非常类似的问题:请参阅上面的更新,谢谢!非常相似的问题:请看上面的更新,谢谢!答案的第一部分是正确的,第二部分是胡说八道。如果您执行Thread.currentThread().interrupt(),您就是在中断当前线程,如果您可以执行,那么您显然没有在其他任何地方被阻塞。答案的第一部分是正确的,第二部分是无意义的。如果执行Thread.currentThread().interrupt(),则中断当前线程,如果可以执行,则显然不会在其他任何地方阻塞。
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();
}
}