`
OpenMind
  • 浏览: 179045 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java系统时钟几个值得思考的问题

    博客分类:
  • java
阅读更多

System.currentTimeMillis()是依赖于系统时钟的,也就是说,如果你把自己的系统时钟更改了,这个函数的返回会立即生效,变成更改后的值;

System.nanoTime()主要用于记录一个时间段的长度,或者说一个超时,在这个过程中,你更改系统时钟也不会影响。

两个方法的精度一个是毫秒,一个是纳秒,但都是不靠普的(有些系统的时间粒度是10ms),nanoTime()的调用也会消耗几微妙,所以不靠普;

但粒度不是我讨论的重点。

 

我们程序中的timer是很常用的功能,归根到底到下面的API:

 

LockSupport. public static void parkNanos(long nanos) 

 和

  

Thread.sleep(long millis)

 

  还有Object.wait

 

不幸的是,但它们都是基于系统时钟的。

下面是我的测试,这个测试的过程是:启动后等待10秒钟,然后打印等待的时间:

	public static void main(String[] args) throws InterruptedException {
		long s = System.nanoTime();
		int _10sec = 10 * 1000;
		LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(_10sec));
		long e = System.nanoTime();
		long used = e - s;
		System.out.println("Used:" + TimeUnit.NANOSECONDS.toMillis(used));
	}

 在运行上面程序之后,在系统命令行执行下面命令重置时间:

[atlas@atlas-pc ~]$ date && sudo date -s 16:10:40
2013年 04月 10日 星期三 16:10:57 CST
2013年 04月 10日 星期三 16:10:40 CST

 java程序输出:Used:27889

我把时钟向前拨了17s,一个park10s的程序27秒后才结束;

同样的,测试Thread:

	public static void main(String[] args) throws InterruptedException {
		long s = System.nanoTime();
		int _10sec = 10 * 1000;
		Thread.sleep(_10sec);
		long e = System.nanoTime();
		long used = e - s;
		System.out.println("Used:" + TimeUnit.NANOSECONDS.toMillis(used));
	}

 运行后,重置时钟:

[atlas@atlas-pc ~]$ date && sudo date -s 16:33:40
2013年 04月 10日 星期三 16:34:03 CST
2013年 04月 10日 星期三 16:33:40 CST

 

java程序输出:Used:33569

 

这篇文章介绍了系统时钟和Java里面的几个API。

 

结论:

当我们重置服务器的时间(有些是通过网络同步的),

1,那些依赖系统时钟的程序(timer,scheduler,etc)会出现问题,

2,依赖时间判断的心跳会出问题,

 

UPDATE:

经过后期的测试,发现只有在linux下有上面的问题,MAC和windows都没有。

后面我做了一个sleep程序,调用系统的sleep 命令,然后Porcess.waitFor(),可以避免时间往前拨的问题。
可以用于一些非常关键的Java Timer的调度。
 

 

 

分享到:
评论
1 楼 OpenMind 2014-05-07  
发现IBM JDK的System.nanoTime()没有实现 API描述的 “not related to any other notion of system or wall-clock time” 它是依赖系统时钟的,就是从System.currentTimeMillis()直接换算过去的。妈的。

相关推荐

    java时钟java。java

    在Java编程语言中,"java时钟java.java"可能是一个示例程序,用于演示如何在Java中创建和使用时钟。作为一个初学者,你可能会对以下几个关键知识点感兴趣: 1. **Java时间日期API**:在Java 8之前,Java使用`java....

    JAVA时钟 源代码

    JAVA时钟 源代码

    Java数字时钟

    在Java中创建数字时钟涉及到多个关键知识点,包括图形用户界面(GUI)、事件处理、线程管理和时间日期处理。下面我们将深入探讨这些核心概念。 1. **Java图形用户界面(GUI)**: Java提供了多种库来创建GUI,如...

    JAVA 模拟时钟实验报告

    在Java编程中,模拟时钟的实现是一个典型的图形用户界面(GUI)和多线程应用。本实验报告主要介绍了如何使用Java的AWT和Swing库来构建一个模拟时钟程序。下面将详细讨论相关知识点。 1. **AWT和Swing组件**: AWT...

    java写的系统时钟

    系统时钟,安装了JDK的朋友双击可运行,没有安装的朋友,安装后双击可运行#83万恶的字数限制

    java GUI时钟小程序

    对于这个时钟小程序,代码可能分为以下几个部分: 1. 主类:初始化Swing应用,创建并设置JFrame,以及启动定时器。 2. 时间显示组件:可能是JLabel,用于显示当前时间,实现ActionListener接口以响应定时器事件。 3....

    Java练手_电子时钟

    在本项目"Java练手_电子时钟"中,我们主要关注的是如何使用Java编程语言来实现一个实时更新的数字时钟。这个练习涉及到多个Java技术领域,包括Java线程、AWT(Abstract Window Toolkit)绘图库以及Swing组件库。下面...

    java图形时钟基于自带多媒体编程

    在这个项目中,开发者使用了Eclipse作为集成开发环境(IDE),结合Java的多媒体功能,来构建这个图形时钟。下面将详细介绍这个项目所涉及的主要知识点: 1. **Java AWT库**: AWT(Abstract Window Toolkit)是...

    java 时钟源码 java 时钟源码

    Java 时钟源码的编写通常涉及以下几个关键点: - **创建时钟对象**: Java 8 引入了`Clock`接口,它是全局时钟的抽象,可以通过`Clock.systemDefaultZone()`或`Clock.systemUTC()`获取系统默认时区或UTC时钟。 - **...

    使用JAVA编制时钟程序

    在Java中编写时钟程序,主要会用到以下几个关键知识点: 1. **线程(Threads)**:为了实时更新时间,我们需要创建一个新的线程来负责不断刷新时间显示。Java中的`Thread`类或者`Runnable`接口可以用来创建和管理...

    java实现数字时钟

    在这个项目中,我们将讨论如何利用Java语言来创建一个实时更新的数字时钟,显示电脑的当前时间。 首先,我们需要导入相关的Java库。在Java中,`java.time` 包提供了处理日期和时间的类。我们要用到的主要类是 `...

    JAVA语言时钟源码

    "JAVA语言时钟源码"这个标题指的是使用Java来实现的时钟功能的代码示例。这些源码文件可能是为了教学目的,帮助初学者理解如何在Java中处理时间或创建用户界面。 `MyClock.java`和`DigitalClock.java`可能分别代表...

    java图形界面时钟

    总之,这个"java图形界面时钟"项目展示了Java GUI编程的基本原理和技巧,包括窗口和组件的设计、图形绘制、时间处理以及定时器的应用。通过优化代码,可以进一步提高时钟的准确性和视觉效果,使之成为一个优秀的桌面...

    Java编写时钟代码

    在Java编程语言中,创建一个时钟应用涉及到对时间的获取、处理和显示。这个过程主要依赖于Java的标准库类`java.util.Calendar`和`java.time`包中的类。下面我们将详细探讨如何利用这些类来编写一个时钟代码。 首先...

    java动态时钟案例

    在Java编程语言中,创建一个实时小时钟程序是一项基础但重要的练习,可以帮助初学者更好地理解线程、时间处理以及GUI(图形用户界面)设计。在这个案例中,我们可以通过以下步骤来实现一个简单的动态时钟: 1. **...

    java实验 时钟代码

    在Java编程语言中,设计一个时钟代码是一个常见的学习任务,它可以帮助初学者理解线程、日期时间API以及用户界面的基本概念。在这个实验中,我们将深入探讨如何创建一个能够实时显示当前时间的Java时钟应用。 首先...

    java实现模拟时钟

    在这个特定的项目“java实现模拟时钟”中,开发者使用Swing构建了一个能够显示当前时间的模拟时钟。Swing提供了一系列组件,如JFrame、JLabel等,可以方便地构建出丰富的用户界面。 1. **Swing基础**: Swing是...

    java动态时钟效果

    以上代码展示了如何创建一个简单的Java动态时钟。在这个例子中,我们创建了一个`ClockPanel`类,其中包含了定时器和绘图逻辑。在主程序中,我们创建了一个`JFrame`并添加了`ClockPanel`实例。这样,当程序运行时,就...

    Java定时器数字时钟

    在这个Java程序中,数字时钟会不断更新,与系统的实际时间保持同步,这意味着它会每隔一秒或更短的时间间隔刷新一次时间显示,确保用户看到的时间是最准确的。 实现这样的功能,Java主要依赖于`java.util.Timer`和`...

Global site tag (gtag.js) - Google Analytics