我正在使用線程池來使多個不重要的任務排隊和(可能)執行,但是我需要能夠輕鬆地取消所有排隊和執行的任務,並從一個新的隊列開始刮。如何有效地重置線程池
即:
// 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);
我忽略了呼籲「淨化」,因爲這是緩慢的,隊列將稍後收拾無論如何。我知道當前正在執行的任務可能不會被終止,這對我很有用。
謝謝。
如果你已經回答了你的問題,把答案***回答部分***,不是問題。 – 2013-04-22 05:05:39
@NicolBolas感謝downvote和譴責。我使用了其中一個很有幫助的海報答案,但是爲了澄清我的用法,以防將來幫助人們。我不想通過自己回答我從其他人那裏複製的東西來爲自己聲明所有的榮耀。你們中的一些人太貴重,這實際上減損了在網絡上使用最有用的資源。爲什麼不把注意力轉向真正需要幫助的職位,而不是權衡已經解決的問題和其他問題。祝你今天愉快。 – pstanton 2013-04-22 05:09:02
「*我不想通過自己回覆我從其他人那裏複製的東西來爲自己聲明自己的所有榮耀。*」然後張貼您的答案,並提出/接受*他們的*。這不是關於「聲稱榮耀」。這是關於適當的組織。問題放在頂部,答案在「答案」部分。這就是爲什麼這是一個「有用的資源」。回答你自己的問題很好。 「*爲什麼不把注意力轉移到真正需要幫助的帖子上,而不是在已經解決好的問題和其他問題上加以考慮。」*當您在其中放入*答案時,它停止成爲一個「好問題」。因此downvote。 – 2013-04-22 05:11:46