簡體   English   中英

Java 定時器線程操作

[英]Java Timer Thread Operation

我正在使用 Timer Thread 運行簡單的打印 function。 問題是,如果我將延遲時間設置為 1000 毫秒,程序將直接退出而沒有任何 output。

但如果我切換到 100 毫秒,程序就可以了。

public class TimerTaskTest01 {
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new MyTask(), 1000);
    }
}
class MyTask extends TimerTask {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("Hello World... ");
        }
        System.out.println("END");
    }
}

我想也許主線程運行得太快了。 但是有沒有人可以告訴我,如果我是對的還是不對...

實際上,您的應用程序可能仍在運行(或應該運行),無論計划的超時如何。 根據JavaDocs ,使用默認構造函數創建Timer將創建一個用戶線程,因此它“能夠防止應用程序終止”。

如果您使用調試器運行應用程序,您應該會看到計時器線程在后台保持活動狀態,如下所示

Thread[Timer-0](Running)

更改Timer以使用守護線程代替

Timer timer = new Timer(true);

將顯示線程實際上在main()完成時立即終止,並以程序的 rest 結束:

terminated, exit value 0

使用ideone嘗試您的代碼還可以驗證程序在main()之后不會終止,而是繼續執行直到 JVM 終止(有一個內置的 5 秒超時),然后打印預期的 output。

output 是否在預定時間或應用程序退出時打印,可能取決於底層操作系統和 JVM。

請參閱Java 中的等待計時器完成 本質上,您的主線程在 Timer 計划發生之前完成。

schedule 方法將以指定的延遲調用您的任務。 您的情況為 1000 毫秒或 100 毫秒。

從您的代碼中,主線程將運行該調度程序,然后退出。 您認為 100 毫秒延遲會很好的假設並不總是正確的。 您的系統可能會以超過 100 毫秒的速度運行主線程並且沒有時間運行您的任務。 這就是大家所說的“種族條件”。

你開始你的任務,然后你的程序結束。 在退出程序之前,您需要等待計時器/任務完成:

public static void main(String[] args) {
    Timer timer = new Timer();
    int sleepTimeMS = 1000;
    timer.schedule(new MyTask(), sleepTimeMS);
    Thread.sleep(sleepTimeMS + 50); // just in case, an extra 50ms
}

上述解決方案中度糟糕。 一個更好的方法是給你一些調度程序,讓你等到它的所有任務都完成。 @fedup 的鏈接建議ScheduledExecutorService

另一種選擇是使用Atomic<int>之類的外部跟蹤任務開始和停止。 這可能容易出錯並導致程序提前退出或永遠休眠。

我會用調度程序 go 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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