2017-04-18 139 views
0

下面的方法是我的主題: -如何停止方法的執行從運行()調用線程

Thread t=new Thread(){ 
    public void run(){ 
     downloadFile(); 
    } 
} 
t.start(); 

public static void main(){ 
    t.interrupt(); 
} 

這裏downloadFile()是長時間運行的方法(下載從服務器文件) 的問題是,即使t.interrupt()稱爲downloadFile()方法仍然保持運行,這不是預期的。我希望downloadFile()方法在線程中斷後立即終止。我應該如何實現它?

謝謝。

EDIT1:

這裏是downloadFile()的骨架,其調用REST API來獲取文件:

void downloadFile(){ 
    String url="https//:fileserver/getFile" 
    //code to getFile method 
} 
+0

那麼,是什麼'downloadFile()'什麼樣子的? – Kayaman

+0

downloadFile()調用rest API從服務器獲取文件。 –

+0

它是如何做到的?您遺漏了最重要的代碼,並提供了無法解釋任何內容的簡單代碼。 – Kayaman

回答

-1

你需要一些標誌,告知一個線程關於終止:

public class FileDownloader implements Runnable { 
    private volatile boolean running = true; 

    public void terminate() { 
     running = false; 
    } 

    @Override 
    public void run() { 
     while (running) { 
      try { 
       downloadFile(); 
      } catch (InterruptedException e) { 
       running = false; 
      } 
     } 

    } 
} 

主要:

FileDownloader fileDownloaderRunnable = new FileDownloader(); 
Thread thread = new Thread(fileDownloaderRunnable); 
thread.start(); 
//terminating thread 
fileDownloaderRunnable.terminate(); 
thread.join(); 
+0

推測,downloadFile()方法可以完全下載單個文件。因此,你的循環會一遍又一遍地下載文件,直到你停止它。這沒有什麼意義。 – Kayaman

0

您的Runnable需要存儲AtomicBoolean標誌來說明它是否已被中斷。

interrupt方法應該只設置標誌爲true。

downloadFile()方法需要檢查下載循環內的標誌,如果已設置,則中止下載。

像這樣的事情,是落實它的唯一干淨的方式,因爲只有downloadFile知道如何安全,乾淨中斷本身,關閉插座等

+1

問題出在實際的網絡運行。如果在讀取過程中有套接字阻塞,那麼停止它的唯一可靠方法是關閉套接字。除非他自己編寫原始網絡代碼,否則不一定有任何「下載循環」(至少可見)。不需要(或使用)複製中斷功能。 – Kayaman