【问题标题】:Java threads executing then being interupted multiple timesJava 线程执行然后被多次中断
【发布时间】:2013-04-18 23:43:18
【问题描述】:

我遇到了一个奇怪的问题,我有一个线程用于侦听套接字上的传入消息。线程是全局声明的,但在方法listen() 中实例化。这使我可以从另一个方法 stopListen() 中断它,该方法第一次完美运行,但是当第二次调用 listen() 和 stopListen() 时,它似乎没有被中断。注释为“做一些事情”的代码在第二次等待传入消息后仍会执行。以下是代码的精简版。

public class Con {
    private Thread listen;

    public void listen() {
        listen = new Thread(new Runnable() {
            @Override
            public void run() {
                while (!Thread.interrupted()) {
                    //Wait for an incoming message
                    if (!Thread.interrupted()){
                        //Do some stuff
                    }
                }
            }
        });
        listen.start();
    }

    public void stopListen() {
        listen.interrupt();
    }
}

我知道有一个变量和一个方法叫同一个东西有点奇怪。这应该有效还是我不能多次使用全局变量来中断线程?

谢谢。

【问题讨论】:

  • 你给listen()打了多少次电话?每次调用都会启动一个新线程。发布使用这些类的代码。
  • listen() 在应用程序加载时被调用。然后我有一个 JDialog,它在其构造函数中调用 stopListen() 并在其关闭方法中侦听 'this.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { con.listen(); } });'
  • 对上面评论的格式不佳表示歉意,这是我在 stackoverflow 上的第一篇文章。只是为了澄清一下,只有一个 JDialog 打开并希望该线程在它打开时被中断。

标签: java multithreading


【解决方案1】:

我看到的主要问题是interrupted() 将重置中断标志(请参阅链接文档),这意味着对interrupted() 的下一次调用将返回 false,除非它再次被中断。相反,请使用不会清除标志的isInterrupted()

另外,正如 chr 所说,如果您启动多个线程(多次调用 listen()),您将只能中断最新的线程。在这种情况下,创建一个List 线程并将它们全部中断(或仅将列表中的第一个线程从列表中删除,或者您想要的任何功能)。

【讨论】:

  • 谢谢。如果我要使用“isInterrupted()”退出任何循环并到达线程的末尾,我假设下一次创建新的监听线程时中断标志将被重置?
  • @user2297216 是的,不用担心,它是特定于对象的。您也可以在 if 子句中使用 isInterrupted(),而在外部 while 循环中使用 interrupted()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多