Java线程执行然后被多次中断

时间:2013-04-18 23:43:18

标签: java multithreading

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

我理解有一个变量和一个叫做同样事情的方法有点奇怪。这应该工作还是不能通过多次使用全局变量来中断线程?

感谢。

1 个答案:

答案 0 :(得分:5)

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

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