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();
    }
}