执行的Java线程被多次中断

执行的Java线程被多次中断,java,multithreading,Java,Multithreading,我有一个奇怪的问题,我有一个线程被用来监听套接字上传入的消息。线程是全局声明的,但在方法listen()内实例化。这允许我从另一个方法stopListen()中断它,该方法在第一次运行时效果很好,但是当第二次调用listen()和stopListen()时,它似乎不会被中断。注释为“dosomething”的代码在第二次等待传入消息后仍然执行。下面是代码的简化版本 public class Con { private Thread listen; public void lis

我有一个奇怪的问题,我有一个线程被用来监听套接字上传入的消息。线程是全局声明的,但在方法listen()内实例化。这允许我从另一个方法stopListen()中断它,该方法在第一次运行时效果很好,但是当第二次调用listen()和stopListen()时,它似乎不会被中断。注释为“dosomething”的代码在第二次等待传入消息后仍然执行。下面是代码的简化版本

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();
    }
}
我理解有一个变量和一个方法叫同一个东西有点奇怪。这是可行的还是我不能通过多次使用全局变量来中断线程


谢谢。

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


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

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


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

您调用了多少次
listen()
?每次调用都将启动一个新线程。发布使用类的代码。应用程序加载时调用listen()。然后我有一个JDialog,它在其构造函数中调用stopListen(),并在其关闭方法“this.addWindowListener(new WindowAdapter(){@Override public void windowClosed(WindowEvent e){con.listen();}});”中侦听很抱歉上面的评论格式不好,这是我关于stackoverflow的第一篇文章。不过要澄清的是,只有一个JDialog打开,并且希望该线程在打开时被中断。您调用了多少次
listen()
?每次调用都将启动一个新线程。发布使用类的代码。应用程序加载时调用listen()。然后我有一个JDialog,它在其构造函数中调用stopListen(),并在其关闭方法“this.addWindowListener(new WindowAdapter(){@Override public void windowClosed(WindowEvent e){con.listen();}});”中侦听很抱歉上面的评论格式不好,这是我关于stackoverflow的第一篇文章。不过要澄清的是,只有一个JDialog处于打开状态,希望该线程在打开时被中断。谢谢。如果我要使用“isInterrupted()”退出任何循环并到达线程的末尾,我假设中断标志将在下次创建新的侦听线程时重置?@user2297216是的,不用担心,它是特定于对象的。您还可以在if子句中使用isInterrupted(),而仅在外部while-loop中使用interrupted()。谢谢。如果我要使用“isInterrupted()”退出任何循环并到达线程的末尾,我假设中断标志将在下次创建新的侦听线程时重置?@user2297216是的,不用担心,它是特定于对象的。您还可以在if子句中使用isInterrupted(),仅在外部while循环中使用interrupted()。