2011-06-10 27 views
1

我啓動一個線程從互聯網上下載內容,一次,線程正在下載一個文件,然後我希望它停止並開始下載另一個文件,我該怎麼辦?我應該指望java中的併發機制嗎?如何在java中停止一個線程並讓同一個線程去做另一件事?

+0

你不能魔術一個線程進入另一種狀態,但您可以編寫線程上運行,否則做一些代碼。不過,我懷疑這個問題的正確答案是「你爲什麼在乎線程做了什麼?」 – 2011-06-10 01:55:06

+1

你能澄清你的問題嗎?你想在主線程等待它們完成的時候同時啓動多個線程,或者你想讓多線程下載每個線程,當主線程想要時可以暫停/重新啓動它們? – Bohemian 2011-06-10 02:11:59

回答

4

當你殺死它(正常我希望)可以使用single-thread executor啓動線程,然後開始一個新的,將確保它使用相同的線程。

// Suppose you have a DownloadFile class that implements Runnable 
DownloadFile task1 = new DownloadFile(); 

... 

ExecutorService exec = Executors.newSingleThreadExecutor(); 

Future<Boolean> future = exec.submit(task1, Boolean.TRUE); 

... 

// Cancel the task 
future.cancel(); 

// Give the executor another task 
DownloadFile task2 = new DownloadFile(); 
... 
exec.submit(task2, Boolean.TRUE); 

其他有用的文檔:

+1

殺死它優雅==獲得未來調用'Future.cancel'。 – jtahlborn 2011-06-10 03:08:12

+0

是否有任何代碼演示? – David 2011-06-12 16:33:23

+0

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html有一個使用'ExecutorService'的通用示例。我將在一個簡單的例子中添加答案。 – trutheality 2011-06-12 18:47:00

0

不建議使用stop()方法停止線程。

我開始一個線程從網上下載 內容,在一個 時間,線程下載一個 文件,然後我希望它停止 開始下載其他文件,我應該怎麼做 ?

您需要使用Thread類的sleep()方法暫停同一個線程對某些特定milliseconds,然後才能繼續使用相同的線程的工作。


注意:一旦線程已經停止,就不能恢復其工作。它將導致IllegalThreadStateException

參見:

+0

這似乎並沒有解決這個問題。 – trutheality 2011-06-10 01:57:57

+0

@trutheality:爲什麼不呢?它正確地解決了這個問題。我們無法停止線程並再次重新啓動相同的停止線程。這是OP試圖實現的...... – 2011-06-10 01:59:41

+0

我很確定OP所說的「停止」與「使用stop()」不一樣。我把它理解爲「我有一個線程正在工作,我想告訴它不要再那麼做了,因爲我想要做其他事情,我如何確保我重用了可用的資源,當我這樣做時沒有後臺線程?「 – trutheality 2011-06-10 02:04:40

0

從當前處理中斷線程,重定向到別的東西是一個典型的同步問題。這是做如下:

有一個工作隊列。作業隊列中的作業[或者更具體地說是作業隊列中的對象]應該有一個線程將執行的方法[比如process()]。線程通常不知道process()方法的細節。它只關心它必須運行process()方法。

線程必須等待作業隊列。這是做如下:

Job j = null; 

synchronized(jobQueueInstance) 
{ 
    if(jobQueueInstance.isEmpty()) 
    { 
     jobQueueInstance.wait(); 
    } 

    j = jobQueueInstance.poll(); //get the job from the head of the queue 
} 

try 
{ 
    j.process(); 
} 
catch(InterruptedException ex) 
{ 
    //thread is interrupted, means it needs to abandon this job and fetch a new one from the queue 
} 

我希望這可以幫助。不過我已經省略了一些事情過於簡單化的問題:

  1. 我省略了Job類聲明,我想它要麼是一個接口或抽象類。

  2. 我也省略了一些其他線程將在jobQueueInstance上添加new Job()notify()的部分。

  3. 也省略了有關線程將interrupt()「忙」的工作運行的線程的一部分。

注意線程3和線程4可以是相同的線程。

0

你應該使用該軟件的下載將超時上下載。這通常會導致您可以捕獲的異常,清理您正在執行的操作並繼續。

除非您使用支持軟件中斷或超時設置,也沒有安全的方式來迫使這對外部發生。如果您的意圖是儘快關閉,您可以安全地使用stop()。 (在這種情況下,System.exit()的是一個更好的選擇)

如果你有,你別無選擇,只能殺一個庫,你需要在一個單獨的進程中運行,並殺死的全過程。這將確保所使用的資源將被操作系統清理。 (假定它沒有留下臨時文件等;)

相關問題