0

我有一个奇怪的问题,我有一个线程用于侦听套接字上的传入消息。线程是全局声明的,但在方法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();
    }
}

我知道拥有一个变量和一个称为同一事物的方法有点奇怪。这应该工作还是我不能多次使用全局变量来中断线程?

谢谢。

4

1 回答 1

5

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

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

于 2013-04-18T23:59:54.873 回答