让我烦恼的错误与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错误:任何解决方法?相关推荐

  1. java关闭服务_实现优雅地关闭Docker中的java服务

    时至今日,Docker在项目中的应用越来越普遍了,但往往会遭遇一些麻烦,比如说,有几个请求至Docker中的服务,发起了事务处理业务,但每个事务完成可能需要1-5分钟,而此时我们正要将Docker停机 ...

  2. mac电脑配置java环境变量_教你在Mac系统中配置JAVA环境变量的方法

    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.下面向大家介绍Mac电脑上如何配置Java ...

  3. 【JAVA错误笔记】 - 【Could not open ServletContext resource [/WEB-INF/applicationContext.xml]解决方法】

    [JAVA错误笔记] - [Could not open ServletContext resource [/WEB-INF/applicationContext.xml]解决方法] 参考文章: (1 ...

  4. 怎么查看usb读取信息_电脑弹出USB设备时提示该设备正在使用中的解决方法

    转载的文章,原文: 电脑弹出USB设备时提示该设备正在使用中的解决方法-系统城​www.xitongcheng.com 电脑弹出USB设备时提示该设备正在使用,虽然在正常显示时并没有程序在使用,但是确 ...

  5. commit git idea 速度慢_关于Idea使用git时commit特别慢的问题及解决方法

    使用idea提交代码到本地git仓库时,可能会出现提交速度特别慢的情况,因为是本地提交,所以可以排除网络原因,那就有可能是电脑性能问题,一般生产力工具也不是说换就换的,主要是各种配置和环境需要重新搭建 ...

  6. mysql 死锁原因_Mysql并发时经典常见的死锁原因及解决方法

    1.mysql都有什么锁 MySQL有三种锁的级别:页级.表级.行级. 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒 ...

  7. FTP连接时出现“227 Entering Passive Mode” 的解决方法(附加实际案例)

    FTP连接时出现"227 Entering Passive Mode" 的解决方法 前段时间在本地的win7搭建了一个简单的FTP服务器用来测试在linux服务器上生成的批量报文, ...

  8. ## 《错误: 找不到或无法加载主类 practice11》解决方法

    <错误: 找不到或无法加载主类 practice11>解决方法 1.csdn上已经有关于环境变量和包的问题导致该错误的产生的解法,这里不再详述. 2.我发现在vscode上,.class文 ...

  9. Windows下在Django中创建项目时ImportError: No module named django.core解决方法

    Windows下在Django中创建项目时ImportError: No module named django.core解决方法 今天在对照<Python编程:从入门到实践>学## 标题 ...

最新文章

  1. 千人千面,撩拨你的个性化广告
  2. 神经网络中激活函数的真正意义?
  3. Ubuntu安装VLC播放器
  4. 关于助动词和过去分词的一点见解
  5. Fabric 链码Chaincode 的安装、初始化、调用、升级
  6. python 3 面向过程编程
  7. 深刻理解HDFS工作机制
  8. mysql索引0affected_mysql 创建索引和删除索引
  9. 通用印刷体文字识别_印刷体文字识别(汉字)中文符的分割
  10. 用IDM怎么批量下载视频
  11. 数学物理方法 数学物理方程
  12. 静态类型的 NSUserDefaults
  13. 人人商城图片错乱问题
  14. django教程day07
  15. 基于C语言实现的足球信息查询系统 课程报告+项目源码+演示PPT+项目截图
  16. 北京华虹正式加入CPChain行业节点
  17. opencv3学习:reshape函数
  18. dhl软件_DHL的完整形式是什么?
  19. 经济法基础——第三章第一节、支付结算概述
  20. ubuntu 安装百度云网盘

热门文章

  1. 使用 RxJs Observable 来避免 Angular 应用中的 Promise 使用
  2. 如何从Angular的ActivatedRoute数据结构中获得运行时路由信息
  3. SAP托管在Github上的ABAP编程规范
  4. SAP Spartacus routing参数的权重和HTTP校验逻辑
  5. 使用WebIDE开发Android应用
  6. Some Fiori offline screenshot in Mac
  7. try to navigate from button to line item page
  8. SAP UI5 new sap.ui.commons.Button trigger component load
  9. 推荐一个好玩的鼠标和键盘使用情况统计软件,完全免费
  10. 一个短小精悍的在线jshint工具