2013-04-18 169 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