簡體   English   中英

無法提前很長時間安排 TimerTask

[英]Unable to schedule a TimerTask a long time in advance

大量編輯/更新:我試圖提前很長時間安排任務。 我相信它正在對流程做一些事情,因為它認為它不會做任何其他事情。 我應該將 HOUR_OF_DAY 用於 24 小時而不是小時,但仍然無法正常工作。 新代碼:

public class OtherMainClass {
    private static Timer timer;
    private static Calendar cal;

    public static void main(String[] args) throws InterruptedException {
        cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
        cal.set(Calendar.HOUR_OF_DAY, 8);
        cal.set(Calendar.MINUTE, 0);
        System.out.println("Changed to: " + cal.getTime());
        timer = new Timer();
        System.out.println("current time is: " + Calendar.getInstance().getTime());
        System.out.println("Scheduled for: " + cal.getTime());
        timer.schedule(new MyTimerTask(), cal.getTime());
        timer.schedule(new MyTimerCheckTask(), 0, 1000*60*10);
    }

    public static class MyTimerTask extends TimerTask {

        @Override
        public void run() {
            System.out.println("in run at: " + Calendar.getInstance().getTime());
        }
    }

    public static class MyTimerCheckTask extends TimerTask {

        @Override
        public void run() {
            System.out.println("cal at: " + Calendar.getInstance().getTime() + " is: " + OtherMainClass.cal.getTime());
        }
    }
}

命令行輸出(在“is:”之后是傳遞到日程表中的日歷對象。):

Changed to: Fri Feb 14 08:00:41 GMT 2020
current time is: Thu Feb 13 23:25:41 GMT 2020
Scheduled for: Fri Feb 14 08:00:41 GMT 2020
cal at: Thu Feb 13 23:25:41 GMT 2020 is: Fri Feb 14 08:00:41 GMT 2020
cal at: Thu Feb 13 23:35:41 GMT 2020 is: Fri Feb 14 08:00:41 GMT 2020
cal at: Thu Feb 13 23:45:41 GMT 2020 is: Fri Feb 14 08:00:41 GMT 2020
cal at: Thu Feb 13 23:55:41 GMT 2020 is: Fri Feb 14 08:00:41 GMT 2020
cal at: Fri Feb 14 09:39:27 GMT 2020 is: Fri Feb 14 08:00:41 GMT 2020
in run at: Fri Feb 14 09:39:27 GMT 2020

請注意最后非常有趣的運行,以及正在運行的其他任務。 我單擊命令行,將其轉換為選擇模式,然后使用 control-c 退出該模式,幾秒鍾后,它完成了兩個任務。 (在我單擊命令行之前它應該已經運行很久了。來自java -version Java 版本

openjdk version "1.8.0_242"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.242-b08, mixed mode)

操作系統:Windows 10

我在星期五 11:30 左右進行了一項測試。 我將 Windows 睡眠設置更改為 1 小時(開始 -> 設置 -> 系統 -> 電源和睡眠)。 自從星期五 8:00 過去了,我把日子改成了星期六。 我還將重復間隔更改為每半小時3*1000*60*10 ,因為我想限制輸出行。 我在 5 個不同的Command Prompt運行代碼,並在周五 11:30 左右啟動它們:

  1. 沒有快速編輯模式。 程序正在運行,我不得不使用Crtl-c來停止它。 睡眠啟動后沒有打印輸出到屏幕上 (誠​​然,我沒有等到一段時間后它是否會打印 8 點鍾的消息,因為它似乎毫無意義。)
  2. 快速編輯模式。 沒有點擊里面的畫面。 與 1 相同。
  3. 快速編輯模式。 在屏幕內單擊並立即使用Ctrl^c取消。 提示頂部欄更改為“選擇命令提示符..”並返回“命令提示符..”。 與 1 相同。
  4. 快速編輯模式。 單擊屏幕內部並突出顯示一些測試。 提示頂部欄更改為“選擇命令提示符”。 在那之后絕對沒有打印輸出,直到我按下Ctrl^c並且打印輸出就好像我剛剛啟動程序一樣,它只是打印了下面的內容。 但是,我不僅退出了程序,而且還恢復了 30 分鍾間隔的打印輸出,如下所示:
  5. 快速編輯模式。 在屏幕內單擊(僅此而已)。 提示頂部欄更改為“選擇命令提示符”。 同4。

這是 4 和 5 的結果,僅在我周六 9:43 退出“選擇命令提示符”模式后才開始打印:

Changed to: Sat Feb 15 08:00:16 CET 2020
current time is: Sat Feb 15 09:49:13 CET 2020
Scheduled for: Sat Feb 15 08:00:16 CET 2020
in run at: Sat Feb 15 09:49:13 CET 2020
cal at: Sat Feb 15 09:49:13 CET 2020 is: Sat Feb 15 08:00:16 CET 2020
cal at: Sat Feb 15 10:19:13 CET 2020 is: Sat Feb 15 08:00:16 CET 2020
cal at: Sat Feb 15 10:49:13 CET 2020 is: Sat Feb 15 08:00:16 CET 2020
cal at: Sat Feb 15 11:19:13 CET 2020 is: Sat Feb 15 08:00:16 CET 2020
...

我在將 Windows 睡眠設置設置為“從不”的情況下進行了另一項測試。 自從星期六 8:00 過去了,我把日子改成了星期天。 我再次在 5 個不同的Command Prompt運行代碼,並在星期六 15:30 左右啟動它們:

  1. 沒有快速編輯模式。 工作沒有問題。 見下文。
  2. 快速編輯模式。 沒有點擊里面的畫面。 與 1 相同。
  3. 快速編輯模式。 在屏幕內單擊並立即使用Ctrl^c取消。 提示頂部欄更改為“選擇命令提示符..”並返回“命令提示符..”。 與 1 相同。
  4. 快速編輯模式。 單擊屏幕內部並突出顯示一些測試。 提示頂部欄更改為“選擇命令提示符”。 在那之后絕對沒有打印輸出 直到我按下Ctrl^c並且打印輸出與上面的測試相同。
  5. 快速編輯模式。 在屏幕內單擊(僅此而已)。 提示頂部欄更改為“選擇命令提示符”。 在那之后絕對沒有打印輸出

結果:

Changed to: Sun Feb 16 08:00:31 CET 2020
current time is: Sat Feb 15 15:35:31 CET 2020
Scheduled for: Sun Feb 16 08:00:31 CET 2020
cal at: Sat Feb 15 15:35:31 CET 2020 is: Sun Feb 16 08:00:31 CET 2020
cal at: Sat Feb 15 16:05:31 CET 2020 is: Sun Feb 16 08:00:31 CET 2020
..snip..
cal at: Sun Feb 16 07:05:31 CET 2020 is: Sun Feb 16 08:00:31 CET 2020
cal at: Sun Feb 16 07:35:31 CET 2020 is: Sun Feb 16 08:00:31 CET 2020
in run at: Sun Feb 16 08:00:31 CET 2020
cal at: Sun Feb 16 08:05:31 CET 2020 is: Sun Feb 16 08:00:31 CET 2020

Shaun Rowan為什么我的命令提示符在 Windows 10 上凍結的答案 你提供了提及:

每當您單擊 Windows 10 中的命令窗口時,它會在嘗試寫入控制台時立即停止應用程序進程

所以它似乎也不是Command Prompt的錯誤,而是一個feature

根據我的 Window 10 應用程序是否會在睡眠或休眠模式下繼續更新或下載? A. 用戶

睡眠是一種省電狀態,當您想再次開始工作時,它允許計算機快速恢復全功率運行(通常在幾秒鍾內)。 將計算機置於睡眠狀態就像暫停 DVD 播放器一樣 — 計算機會立即停止正在執行的操作,並准備在您想要繼續工作時重新啟動。

如果您對 Windows 睡眠模式非常感興趣,TechRepublic 有一篇關於Investigating Sleep states in Windows 10的文章描述了睡眠的 6 個階段,從(處理器時鍾停止)->(處理器關閉以節省電量)-> (主板上的其他芯片可能會關閉)


結論:

如果您希望您的 java 程序繼續執行,請確保您的命令提示符窗口不在“選擇命令提示符..”模式下,並確保您的計算機不會進入睡眠模式,因為這兩種模式中的任何一個都會停止程序的執行。

暫無
暫無

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

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