[英]java.lang.IllegalStateException: TimerTask is scheduled already
[英]When a Java TimerTask is scheduled in a Timer, is it already “executing”?
我想澄清一下有關TimerTask的內容。 如果您有以下代碼:
timer.schedule(task, 60000);
如果任務計划在接下來的1分鍾內運行,那么任務對象是否已在執行?
因為在我的代碼中某處我調用了task.cancel()但似乎調用並沒有阻止
要執行的任務。 我甚至記錄了來自調用的返回值,它返回false。
當我閱讀取消方法的文檔時,我想到了我的問題:
取消TimerTask並將其從Timer的隊列中刪除。 通常,如果調用沒有阻止TimerTask至少運行一次,則返回false。 后續調用無效。 如果調用阻止了計划執行,則返回true,否則返回false。
我相信我在1分鍾的延遲之前打電話給cancel()。 但是如何取消返回false,
是[任務]已經執行了嗎?
希望你能給我提供線索/提示甚至解釋。 謝謝!
不,它將在60秒內調用此任務的run方法。 如果task.cancel()
返回false
,那可能意味着三件事:
因此,如果您確定在安排任務后60秒內調用cancel
,則可能會多次調用它,並從后續cancel
獲取結果,或者您在其他任務上調用取消。
您可以通過以下方式實現所需的功能
ScheduledExecutorService.schedule(可調用,延遲,timeunit)
這里概述了 ScheduledExecutorService是首選方式的原因:
定時器可以對系統時鍾的變化敏感,而ScheduledThreadPoolExecutor則不然
Timer只有一個執行線程,因此長時間運行的任務可以延遲其他任務。 ScheduledThreadPoolExecutor可以配置任意數量的線程。 此外,如果需要,您可以完全控制創建的線程(通過提供ThreadFactory)
在TimerTask中拋出的運行時異常會殺死一個線程,從而使得計時器死機:-(...即計划任務將不再運行.ScheduledThreadExecutor不僅捕獲運行時異常,而且它允許您根據需要處理它們(通過覆蓋afterExecute方法) ThreadPoolExecutor)。拋出異常的任務將被取消,但其他任務將繼續運行。
我不知道為什么你的代碼返回false
。
以下代碼打印為true
。
import java.util.Timer;
import java.util.TimerTask;
public class Test {
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("hi");
}
};
timer.schedule(task, 60000);
System.out.println(task.cancel());
}
}
如果對最后一個println
進行了注釋,則程序打印為hi
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.