java时间错误_更改操作系统时间时睡眠()中的Java错误:任何解决方法?
讓我煩惱的錯誤與this ticket相同?;旧?#xff0c;如果您將OS時鐘更改為過去的日期,則更改時正在休眠的所有線程都不會被喚醒。
我正在開發的應用程序意味著24/24運行,我們希望能夠在不停止的情況下更改操作系統日期(例如,從夏季時間切換到冬季時間)。目前發生的事情是,當我們將日期更改為過去時,應用程序的某些部分就會凍結。我在多臺計算機,Windows XP和Linux 2.6.37以及最近的JVM(1.6.0.22)上觀察到了這一點。
我嘗試了很多Java睡眠原語,但它們都有相同的行為:
的Thread.sleep(長)
Thread.sleep(long,int)
的Object.wait(長)
Object.wait(long,int)
的Thread.join(長)
Thread.join(long,int)
LockSupport.parkNanos(長)
java.util.Timer中
javax.swing.Timer中
現在,我不想解決這個問題。我認為我無法阻止睡眠線凍結。但至少,我希望在檢測到危險的系統時鐘變化時警告用戶。
我想出了一個可以檢測到這些變化的監控線程:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
long ms1 = System.currentTimeMillis();
long ms2;
while(true) {
ms2 = ms1;
ms1 = System.currentTimeMillis();
if (ms1 < ms2) {
warnUserOfPotentialFreeze();
}
Thread.yield();
}
}
});
t.setName("clock monitor");
t.setPriority(Thread.MIN_PRIORITY);
t.setDaemon(true);
t.start();
問題是這使得應用程序在空閑時從2%的CPU使用率增長到15%。
您是否有想法解決原始問題,或者您能想到另一種監控線程凍結外觀的方法嗎?
修改
Ingo建議不要觸摸系統時鐘。我同意通常不需要它。問題是我們無法控制客戶對計算機的操作(我們計劃銷售數百份)。
更糟糕的是:我們的一臺機器沒有任何人工干預就會出現這個問題。我猜操作系統(Windows XP)定期將其時鐘與RTC時鐘同步,這使得OS時鐘自然會及時回溯。
后記
我發現我的問題中的一些陳述是錯誤的。我最初的問題實際上涉及兩個不同的原因。現在,我可以肯定地說兩件事:
僅在我的機器上(帶有內核2.6.37且帶有OpenJDK 64位1.6.0_22的archlinux),Thread.sleep,Object.wait,Thread.join,LockSupport.parkNanos有同樣的問題:只有當系統時鐘到達喚醒的“目標”時間時,它們才會喚醒。但是,我的shell中的簡單sleep不會出現問題。
在我測試過的所有機器上(包括我的),java.util.Timer和java.swing.Timer都有同樣的問題(在達到“目標”時間之前它們會被阻止)。
醇>
所以,我所做的是通過更簡單的實現替換了所有java的Timer。這解決了我的所有機器的問題(我只希望我的機器不僅僅是一個規則)。
總結
以上是生活随笔為你收集整理的java时间错误_更改操作系统时间时睡眠()中的Java错误:任何解决方法?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 别走错了!成都国际航班今起正式转场天府机
- 下一篇: 第三方工具 Rufus 3.22 正式版