2013-04-18 129 views
0

我遇到一个奇怪的问题,我有一个线程用于侦听套接字上的传入消息。该线程是全局声明的,但在方法listen()中实例化。这允许我从另一个方法stopListen()中断它,但是当第一次调用listen()和stopListen()时,它看起来不会被中断。代码评论为“做一些事情”在第二次等待传入消息后仍然执行。以下是代码的简化版本。执行多次中断的Java线程

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

你叫'listen()'多少次?每次调用都会启动一个新线程。发布使用类的代码。 – chr

+0

listen()在应用程序加载时调用。然后,我有一个JDialog,在它的构造函数调用stopListen(),并在其关闭的方法听 “this.addWindowListener(新WindowAdapter的(){ @覆盖 公共无效的windowClosed(WindowEvent五){ con.listen(); } });' – user2297216

+0

对上面评论中格式不好的道歉,我在stackoverflow上的第一篇文章。只是为了澄清,只有一个JDialog是打开的,并且希望当这个线程被中断时。 – user2297216

回答

5

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

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

+0

感谢您的支持。如果我使用'isInterrupted()'来退出任何循环并到达线程的末尾,我认为中断标志会在下一次创建新的侦听线程时被重置? – user2297216

+0

@ user2297216是的,不用担心,它是特定于对象的。你也可以在if子句中使用isInterrupted(),并且只在外部while循环中使用interrupt()。 – ddmps