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

使我烦恼的臭虫和这张票一样。基本上,如果将操作系统时钟更改为过去的日期,则更改时休眠的所有线程都不会唤醒。

我正在开发的应用程序打算在24/24上运行,我们希望能够在不停止OS的情况下更改OS日期(例如,从夏季时间切换为冬季时间)。目前发生的事情是,当我们将日期更改为过去的日期时,应用程序的某些部分就会冻结。我在多台计算机上,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时钟同步,这会使操作系统时钟自然地回到时间上。

结语

我发现问题中的某些陈述是错误的。实际上,我的最初问题涉及两个单独的原因。现在,我可以肯定地说两件事:

在我的机器只(ArchLinux的内核2.6.37与OpenJDK的64位1.6.0_22) ,Thread.sleep,,Object.wait 有同样的问题:他们醒来,只有当系统时钟到达觉醒的“目标”的时间。但是,在我的shell中没有一个简单的问题。Thread.join``LockSupport.parkNanos``sleep

在所有的机器我测试(包括矿山),java.util.Timer并java.swing.Timer有同样的问题(他们被封锁,直到达到“目标”时间)。

因此,我所做的是,我用Timer一个更简单的实现替换了所有Java 。这解决了除我之外的所有机器的问题(我只是希望我的机器是一个例外,而不是一条规则)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值