2015-11-04 59 views
-2

我有一個客戶端 - 服務器應用程序運行接收方法在單獨的線程中運行。線程會給出一些時間來完成作業,線程將檢查狀態。如何重新啓動線程而不使用Thread.stop()?

有些情況下,接收方法將因包或ACK丟失而被阻塞。如果發生這種情況,我如何停止線程並在下次嘗試時再次啓動它?

衆所周知,Thread.stop()已被棄用。

+1

請加密碼。我們在談論TCP還是UDP? – Fildor

+3

爲什麼線程需要停止只是因爲網絡通信中發生的事情? – Kayaman

+0

@Kayman是對的。您不需要重新啓動線程,只需正確處理即可。預計Packetloss。在TCP的情況下,它將由TCP堆棧爲您處理;你只需要給它一些時間。 – vhu

回答

0

您可以使用中斷髮送到線程並處理它們以執行重試。這是一個將啓動線程的示例,在設置布爾值完成之前,線程將不會退出。不過,我正在中斷從主線程的線程,使其重新開始。

public class Runner implements Runnable { 

    private boolean done; 

    @Override 
    public void run() { 
     while (!done) { 
      try { 
       doSomeLongRunningStuff(); 

      } catch (InterruptedException e) { 
       System.out.println("Interrupted.."); 
      } 
     } 
    } 

    private void doSomeLongRunningStuff() throws InterruptedException { 
     System.out.println("Starting ... "); 
     Thread.sleep(300); 
     System.out.println("Still going ... "); 
     Thread.sleep(300); 
     done = true; 
     System.out.println("Done"); 
    } 

    public static void main(final String[] args) throws InterruptedException { 
     final Thread t = new Thread(new Runner()); 
     t.start(); 
     Thread.sleep(500); 
     t.interrupt(); 
     Thread.sleep(500); 
     t.interrupt(); 
    } 
} 

您是否可以這樣做,取決於您打電話的方式。執行TCP連接的框架可能支持或不支持中斷。

+0

只有當線程正常運行而不被阻塞並因此停止時纔會發生這種情況?如果它在執行過程中被阻塞或者處於睡眠狀態,並且不會再次到達while循環呢?請問代碼仍然有效嗎? –

+0

這在任何情況下都不起作用 - 但正如您在示例中所看到的,中斷線程從睡眠狀態開始並不成問題。您應該在連接或使用調試器查看您的案例中實際發生的情況時查看代碼,以檢查您的線程是如何暫停的。 – stalet

2

不能重新啓動Java線程所有,使用或不Thread.stop().

你必須創建一個新的。

但是,您可以重用Runnable.

0

我們不應該重新啓動一個線程是無效的,一旦線程已經comepleted執行。

+0

程序員是否永遠不會重用線程?你的意思是它是一種糟糕的編程習慣。 –

相關問題