[英]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 左右啟動它們:
Crtl-c
來停止它。 睡眠啟動后沒有打印輸出到屏幕上。 (誠然,我沒有等到一段時間后它是否會打印 8 點鍾的消息,因為它似乎毫無意義。)Ctrl^c
取消。 提示頂部欄更改為“選擇命令提示符..”並返回“命令提示符..”。 與 1 相同。Ctrl^c
並且打印輸出就好像我剛剛啟動程序一樣,它只是打印了下面的內容。 但是,我不僅退出了程序,而且還恢復了 30 分鍾間隔的打印輸出,如下所示:這是 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 左右啟動它們:
Ctrl^c
取消。 提示頂部欄更改為“選擇命令提示符..”並返回“命令提示符..”。 與 1 相同。Ctrl^c
並且打印輸出與上面的測試相同。結果:
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.