我遇到一个奇怪的问题,我有一个线程用于侦听套接字上的传入消息。线程是全局声明的,但在方法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();
}
}
我理解有一个变量和一个叫做同样事情的方法有点奇怪。这应该工作还是不能通过多次使用全局变量来中断线程?
感谢。
答案 0 :(得分:5)
我看到的主要问题是interrupted()
将重置中断标志(请参阅链接文档),这意味着下一次调用interrupted()
将返回false,除非它再次被中断。相反,使用不清除标志的isInterrupted()
!
另外,正如chr所说,如果你启动多个线程(多次调用listen()
),你将只能中断最新的线程。在这种情况下,创建一个List
线程并中断它们(或者只列出列表中的第一个并从列表中删除它,或者你想要的任何功能)。