2017-04-18 92 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