我啓動一個線程從互聯網上下載內容,一次,線程正在下載一個文件,然後我希望它停止並開始下載另一個文件,我該怎麼辦?我應該指望java中的併發機制嗎?如何在java中停止一個線程並讓同一個線程去做另一件事?
回答
當你殺死它(正常我希望)可以使用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);
其他有用的文檔:
殺死它優雅==獲得未來調用'Future.cancel'。 – jtahlborn 2011-06-10 03:08:12
是否有任何代碼演示? – David 2011-06-12 16:33:23
http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html有一個使用'ExecutorService'的通用示例。我將在一個簡單的例子中添加答案。 – trutheality 2011-06-12 18:47:00
不建議使用stop()
方法停止線程。
我開始一個線程從網上下載 內容,在一個 時間,線程下載一個 文件,然後我希望它停止 開始下載其他文件,我應該怎麼做 ?
您需要使用Thread
類的sleep()方法暫停同一個線程對某些特定milliseconds
,然後才能繼續使用相同的線程的工作。
注意:一旦線程已經停止,就不能恢復其工作。它將導致IllegalThreadStateException。
參見:
這似乎並沒有解決這個問題。 – trutheality 2011-06-10 01:57:57
@trutheality:爲什麼不呢?它正確地解決了這個問題。我們無法停止線程並再次重新啓動相同的停止線程。這是OP試圖實現的...... – 2011-06-10 01:59:41
我很確定OP所說的「停止」與「使用stop()」不一樣。我把它理解爲「我有一個線程正在工作,我想告訴它不要再那麼做了,因爲我想要做其他事情,我如何確保我重用了可用的資源,當我這樣做時沒有後臺線程?「 – trutheality 2011-06-10 02:04:40
從當前處理中斷線程,重定向到別的東西是一個典型的同步問題。這是做如下:
有一個工作隊列。作業隊列中的作業[或者更具體地說是作業隊列中的對象]應該有一個線程將執行的方法[比如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
}
我希望這可以幫助。不過我已經省略了一些事情過於簡單化的問題:
我省略了
Job
類聲明,我想它要麼是一個接口或抽象類。我也省略了一些其他線程將在
jobQueueInstance
上添加new Job()
和notify()
的部分。也省略了有關線程將
interrupt()
「忙」的工作運行的線程的一部分。
注意線程3和線程4可以是相同的線程。
你應該使用該軟件的下載將超時上下載。這通常會導致您可以捕獲的異常,清理您正在執行的操作並繼續。
除非您使用支持軟件中斷或超時設置,也沒有安全的方式來迫使這對外部發生。如果您的意圖是儘快關閉,您可以安全地使用stop()。 (在這種情況下,System.exit()的是一個更好的選擇)
如果你有,你別無選擇,只能殺一個庫,你需要在一個單獨的進程中運行,並殺死的全過程。這將確保所使用的資源將被操作系統清理。 (假定它沒有留下臨時文件等;)
- 1. 從事件派發線程(EventQueue)停止另一個線程
- 2. Python:在一個線程中停止另一個線程從另一個線程結束
- 3. 如何讓一個線程等待另一個線程?
- 4. 運行多個線程,並停止一旦一個已停止
- 5. 如何讓一個java線程等待另一個線程的結果?
- 6. 如何讓一個線程等待另一個線程導致java?
- 7. 一個線程停止另一個在C中
- 8. 只停止一個線程
- 9. 停止一個DatagramSocket線程
- 10. 如何讓一個線程等待並執行另一個?
- 11. 一個線程如何在另一個線程中被殺死
- 12. 停止一個非循環Java線程
- 13. 如何讓1個UI線程等待另一個UI線程
- 14. 如何停止一個線程 - Python 3
- 15. 如何讓一個線程等待另一個線程的一部分完成?
- 16. 事件養在另一個線程
- 17. 停止線程從另一個線程c偵聽TcpClient#
- 18. 當另一個線程完成時停止線程。
- 19. 使用另一個線程終止一個線程(循環)
- 20. 睡一個線程,直到在另一個線程中出現事件
- 21. Java:停止從另一個線程的線程中的所有活動
- 22. 如何從Java中的另一個線程中殺死一個線程?
- 23. 如何從c/C++中的另一個線程停止主線程
- 24. 如何從另一個線程停止正在運行的線程?
- 25. ExecuterService停止處理兩個線程中的一個線程
- 26. 如何讓一個線程等待另一個線程?第2章
- 27. 如何讓一個線程解鎖另一個線程鎖定的互斥鎖?
- 28. 觸發事件從另一個線程
- 29. QMutex鎖定在一個線程中,並在另一個線程中解鎖
- 30. 如何在python中完成第二個線程時停止第一個線程?
你不能魔術一個線程進入另一種狀態,但您可以編寫線程上運行,否則做一些代碼。不過,我懷疑這個問題的正確答案是「你爲什麼在乎線程做了什麼?」 – 2011-06-10 01:55:06
你能澄清你的問題嗎?你想在主線程等待它們完成的時候同時啓動多個線程,或者你想讓多線程下載每個線程,當主線程想要時可以暫停/重新啓動它們? – Bohemian 2011-06-10 02:11:59