簡體   English   中英

在Timer中調度Java TimerTask時,它是否已經“正在執行”?

[英]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,

是[任務]已經執行了嗎?

希望你能給我提供線索/提示甚至解釋。 謝謝!

  • 如果任務計划在接下來的1分鍾內運行,則任務對象已在執行

不,它將在60秒內調用此任務的run方法。 如果task.cancel()返回false ,那可能意味着三件事:

  • 任務被安排一次性執行,並且已經運行了OR
  • 任務從未安排過
  • 任務已被取消或

因此,如果您確定在安排任務后60秒內調用cancel ,則可能會多次調用它,並從后續cancel獲取結果,或者您在其他任務上調用取消。


一般來說,我建議使用Timer來支持ScheduledExecutorService

您可以通過以下方式實現所需的功能

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM