2015-05-06 51 views
1

事件發生後,我想運行一個任務/可運行但在2秒內延遲執行。如何在Java中刪除/ postDelayed runnables?

在這2秒鐘內,如果發生同樣的事件,我想刪除上一個任務並重新發布它 - 再次延遲2秒。

一個示例場景是後臺編譯。當一個文件被保存時,我等待2秒鐘,並開始編譯類和其他,依賴類。我不想一直這麼做 - 尤其是如果有編輯器自動保存文件,比如IntelliJ IDEA。

那麼,我怎樣才能在Java中刪除/ postDelayed可運行,像Android這樣的處理程序(remove/postDelayed)?

回答

1

可以使用Executors.newScheduledThreadPool爲的是調度任務, ,你可以按照這個post的回答是:

BlockingQueue<Runnable> queue = threadPool.getQueue(); 

爲了得到排隊的可運行。

+1

最後,我使用了'ScheduledThreadPoolExecutor'這個解決方案的變種。我安排任務被延遲,但刪除不起作用,因爲它沒有比較正確的任務。我所做的是完全清除隊列。有點討厭但有效。 –

+0

會不會Executors.newSingleThreadScheduledExecutor給你更像Android的處理程序的行爲?這將保證發佈到它的Runnables將按順序執行而不是並行執行。 –

0

要延遲任何任務並「重新啓動」延遲,可以使用Swing timer,如果它正在運行,請使用其方法restart

0

我想你可以使用ScheduledExecutor來實現這一點,通過添加一種機制來將排隊的任務替換爲重新排隊的任務。你可以看看ScheduledThreadPoolExecutor的源代碼來給出一個想法,也許會覆蓋ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)的實現,並想出來避免調度,只運行一次任務。

乾杯,