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错误:任何解决方法?相关推荐
- java关闭服务_实现优雅地关闭Docker中的java服务
时至今日,Docker在项目中的应用越来越普遍了,但往往会遭遇一些麻烦,比如说,有几个请求至Docker中的服务,发起了事务处理业务,但每个事务完成可能需要1-5分钟,而此时我们正要将Docker停机 ...
- mac电脑配置java环境变量_教你在Mac系统中配置JAVA环境变量的方法
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.下面向大家介绍Mac电脑上如何配置Java ...
- 【JAVA错误笔记】 - 【Could not open ServletContext resource [/WEB-INF/applicationContext.xml]解决方法】
[JAVA错误笔记] - [Could not open ServletContext resource [/WEB-INF/applicationContext.xml]解决方法] 参考文章: (1 ...
- 怎么查看usb读取信息_电脑弹出USB设备时提示该设备正在使用中的解决方法
转载的文章,原文: 电脑弹出USB设备时提示该设备正在使用中的解决方法-系统城www.xitongcheng.com 电脑弹出USB设备时提示该设备正在使用,虽然在正常显示时并没有程序在使用,但是确 ...
- commit git idea 速度慢_关于Idea使用git时commit特别慢的问题及解决方法
使用idea提交代码到本地git仓库时,可能会出现提交速度特别慢的情况,因为是本地提交,所以可以排除网络原因,那就有可能是电脑性能问题,一般生产力工具也不是说换就换的,主要是各种配置和环境需要重新搭建 ...
- mysql 死锁原因_Mysql并发时经典常见的死锁原因及解决方法
1.mysql都有什么锁 MySQL有三种锁的级别:页级.表级.行级. 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒 ...
- FTP连接时出现“227 Entering Passive Mode” 的解决方法(附加实际案例)
FTP连接时出现"227 Entering Passive Mode" 的解决方法 前段时间在本地的win7搭建了一个简单的FTP服务器用来测试在linux服务器上生成的批量报文, ...
- ## 《错误: 找不到或无法加载主类 practice11》解决方法
<错误: 找不到或无法加载主类 practice11>解决方法 1.csdn上已经有关于环境变量和包的问题导致该错误的产生的解法,这里不再详述. 2.我发现在vscode上,.class文 ...
- Windows下在Django中创建项目时ImportError: No module named django.core解决方法
Windows下在Django中创建项目时ImportError: No module named django.core解决方法 今天在对照<Python编程:从入门到实践>学## 标题 ...
最新文章
- 千人千面,撩拨你的个性化广告
- 神经网络中激活函数的真正意义?
- Ubuntu安装VLC播放器
- 关于助动词和过去分词的一点见解
- Fabric 链码Chaincode 的安装、初始化、调用、升级
- python 3 面向过程编程
- 深刻理解HDFS工作机制
- mysql索引0affected_mysql 创建索引和删除索引
- 通用印刷体文字识别_印刷体文字识别(汉字)中文符的分割
- 用IDM怎么批量下载视频
- 数学物理方法 数学物理方程
- 静态类型的 NSUserDefaults
- 人人商城图片错乱问题
- django教程day07
- 基于C语言实现的足球信息查询系统 课程报告+项目源码+演示PPT+项目截图
- 北京华虹正式加入CPChain行业节点
- opencv3学习:reshape函数
- dhl软件_DHL的完整形式是什么?
- 经济法基础——第三章第一节、支付结算概述
- ubuntu 安装百度云网盘
热门文章
- 使用 RxJs Observable 来避免 Angular 应用中的 Promise 使用
- 如何从Angular的ActivatedRoute数据结构中获得运行时路由信息
- SAP托管在Github上的ABAP编程规范
- SAP Spartacus routing参数的权重和HTTP校验逻辑
- 使用WebIDE开发Android应用
- Some Fiori offline screenshot in Mac
- try to navigate from button to line item page
- SAP UI5 new sap.ui.commons.Button trigger component load
- 推荐一个好玩的鼠标和键盘使用情况统计软件,完全免费
- 一个短小精悍的在线jshint工具