日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

java时间错误_更改操作系统时间时睡眠()中的Java错误:任何解决方法?

發布時間:2023/12/19 windows 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java时间错误_更改操作系统时间时睡眠()中的Java错误:任何解决方法? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

讓我煩惱的錯誤與this ticket相同。基本上,如果您將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错误:任何解决方法?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。