有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ArrayBlockingQueue如何“中断”正在等待的线程。take()方法

我在代码中使用了ArrayBlockingQueue。客户端将等待元素变为可用:

myBlockingQueue.take();

如果队列中没有元素,并且take()无限期地等待某个元素可用,我如何“关闭”我的服务?此方法抛出一个InterruptedException。我的问题是,如何“调用”中断的异常,以便take()退出?(我也对notify()感到困惑,但似乎我在这里帮不上忙……)

我知道我可以插入一个特殊的“EOF/QUIT”标记元素,但这真的是唯一的解决方案吗

更新(关于该评论,它指向另一个问题,有两种解决方案):

上面提到的一个是使用“毒丸对象”,第二个是Thread.interrupt()

myBlockingQueue.take()不是在Thread(扩展线程)中使用,而是实现Runnable。Runnable似乎不提供.interrupt()方法

我怎样才能中断Runnable


共 (3) 个答案

  1. # 1 楼答案

    最简单的方法是保留用于运行runnable的线程的引用,并在关机时中断它

    或者,您可以使用线程池来组织服务的线程。然后线程池负责跟踪和管理线程,包括在关闭时中断线程

    还有一种(不推荐的)方法是枚举JVM中所有正在运行的线程(使用ThreadGroup的方法),并尝试猜测哪个线程运行您的runnable(例如,通过分析每个线程的堆栈)

  2. # 2 楼答案

    找到解决方案:

    如问题中所述,使用“中毒物体”

    使用this.interrupt()中断线程eitehr,或者如果它是可运行的,则使用Thread.currentThread().interrupt();

  3. # 3 楼答案

    您可以像这样实现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();
        }
    }