2013-04-20 40 views
1

我正在使用線程池來使多個不重要的任務排隊和(可能)執行,但是我需要能夠輕鬆地取消所有排隊和執行的任務,並從一個新的隊列開始刮。如何有效地重置線程池

即:

// startup 
pool = Executors.newFixedThreadPool(5); 

// reset 
pool.shutdownNow(); 
pool = Executors.newFixedThreadPool(5); 

我使用的實施現在看來工作,但我不知道那完全關閉並創建一個新的線程池是特別有效的。

重置定期發生,在某些情況下,它會像調度任務一樣經常發生!由於無法確定是否有任何任務正在等待執行(或者是否存在?),我覺得我正在關閉游泳池的方式太頻繁。

是否有更合適的池實現或更好的方法來實現此功能?

編輯:解

我現在運行:

// startup 
pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(5); 

// reset 
for (Future<?> task : pool.getQueue().toArray(new Future[0])) 
    task.cancel(true); 

我忽略了呼籲「淨化」,因爲這是緩慢的,隊列將稍後收拾無論如何。我知道當前正在執行的任務可能不會被終止,這對我很有用。

謝謝。

+0

如果你已經回答了你的問題,把答案***回答部分***,不是問題。 – 2013-04-22 05:05:39

+0

@NicolBolas感謝downvote和譴責。我使用了其中一個很有幫助的海報答案,但是爲了澄清我的用法,以防將來幫助人們。我不想通過自己回答我從其他人那裏複製的東西來爲自己聲明所有的榮耀。你們中的一些人太貴重,這實際上減損了在網絡上使用最有用的資源。爲什麼不把注意力轉向真正需要幫助的職位,而不是權衡已經解決的問題和其他問題。祝你今天愉快。 – pstanton 2013-04-22 05:09:02

+0

「*我不想通過自己回覆我從其他人那裏複製的東西來爲自己聲明自己的所有榮耀。*」然後張貼您的答案,並提出/接受*他們的*。這不是關於「聲稱榮耀」。這是關於適當的組織。問題放在頂部,答案在「答案」部分。這就是爲什麼這是一個「有用的資源」。回答你自己的問題很好。 「*爲什麼不把注意力轉移到真正需要幫助的帖子上,而不是在已經解決好的問題和其他問題上加以考慮。」*當您在其中放入*答案時,它停止成爲一個「好問題」。因此downvote。 – 2013-04-22 05:11:46

回答

-2

您可以取消所有掛起(和可能運行的)任務:

for (Future f: pool.getQueue().toArray(new Future[0])) 
{ 
    f.cancel(true); // or false 
} 
pool.purge(); 
+0

'未來'是'ExecutorService'內部包裝。你永遠不會自己實現'未來'。這樣做'取消(...)'不會中斷關聯的線程。 – Gray 2013-04-20 22:02:03

+0

@Gray OK,'FutureTask' :) – 2013-04-20 22:03:52

+0

不,它不會以@Valeri的方式工作。那些仍然被認爲是'Runnable'。 'FutureTask'僅由併發類創建。 – Gray 2013-04-20 22:04:47

0

您可以監視從提交任務時獲得的所有Futurecancel()所有這些允許您重新使用線程池而不重新創建的任務。但是,我懷疑你會獲得太多額外的效率。

只要你不太經常這樣做,我認爲你的機制應該可以正常工作。有一點要認識到,雖然你打電話pool.shutdownNow(),這隻會中斷正在運行的作業,而不一定會阻止它們。這取決於他們在做什麼以及他們是否正在執行經常拋出InterruptedException或偵聽線程中斷標誌的方法。所以即使shutdownNow()返回,一些任務仍可能正在執行。

+0

是的,我明白關機和取消不一定會停止運行任務/線程。當然,在執行任務之前取消任務會比終止和重新創建包括線程,隊列等在內的所有任務更有效率。 – pstanton 2013-04-21 04:23:11

+0

效率更高,但我只會說略微。這取決於你多久做一次。我的意思是你需要添加代碼來管理運行任務的列表,這也是開銷。我懷疑,當你用新的方式時,你將不會看到明顯的差異。你選擇的答案是完全錯誤的,直到我糾正了它,我從一開始就提出了這個機制。但是,哦@pstanton。 – Gray 2013-04-21 14:43:56

+0

+1,並感謝答案,ThreadPoolExecutor.getQueue意味着我不必管理一個列表。謝謝您的幫助。不知道爲什麼有人低估了你的答案,我討厭它,當人們這樣做,沒有評論... – pstanton 2013-04-22 00:29:48