java - ArrayBlockingQueue - 如何 "interrupt"正在等待 .take() 方法的线程

标签 java concurrency

我在代码中使用了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/

相关文章:

java - 单线程在多核处理器上的数据可见性

java - Libgdx 使用 glClearColor 调暗屏幕

java - JSONException : No value for id

java - 无法执行目标 org.apache.maven.plugins :maven-compiler-plugin:3. 8.1

scala - Scala 的 Actor 框架可以在没有堆栈问题的情况下处理 10.000 个 Actor 吗?

java - 从 dl.util.concurrent 迁移到 java.util.concurrent 的概述/教程

unit-testing - 在 go 中测试连接的正确方法

java打印接口(interface)的数组列表

java - 改造 "java.net.ProtocolException: Unexpected status line",有人吗?

java - 我不明白为什么会出现此错误 : ConcurrentModificationException