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的调度。
相关推荐
在Java编程语言中,"java时钟java.java"可能是一个示例程序,用于演示如何在Java中创建和使用时钟。作为一个初学者,你可能会对以下几个关键知识点感兴趣: 1. **Java时间日期API**:在Java 8之前,Java使用`java....
JAVA时钟 源代码
在Java中创建数字时钟涉及到多个关键知识点,包括图形用户界面(GUI)、事件处理、线程管理和时间日期处理。下面我们将深入探讨这些核心概念。 1. **Java图形用户界面(GUI)**: Java提供了多种库来创建GUI,如...
在Java编程中,模拟时钟的实现是一个典型的图形用户界面(GUI)和多线程应用。本实验报告主要介绍了如何使用Java的AWT和Swing库来构建一个模拟时钟程序。下面将详细讨论相关知识点。 1. **AWT和Swing组件**: AWT...
系统时钟,安装了JDK的朋友双击可运行,没有安装的朋友,安装后双击可运行#83万恶的字数限制
对于这个时钟小程序,代码可能分为以下几个部分: 1. 主类:初始化Swing应用,创建并设置JFrame,以及启动定时器。 2. 时间显示组件:可能是JLabel,用于显示当前时间,实现ActionListener接口以响应定时器事件。 3....
在本项目"Java练手_电子时钟"中,我们主要关注的是如何使用Java编程语言来实现一个实时更新的数字时钟。这个练习涉及到多个Java技术领域,包括Java线程、AWT(Abstract Window Toolkit)绘图库以及Swing组件库。下面...
在Java中编写时钟程序,主要会用到以下几个关键知识点: 1. **线程(Threads)**:为了实时更新时间,我们需要创建一个新的线程来负责不断刷新时间显示。Java中的`Thread`类或者`Runnable`接口可以用来创建和管理...
在这个项目中,开发者使用了Eclipse作为集成开发环境(IDE),结合Java的多媒体功能,来构建这个图形时钟。下面将详细介绍这个项目所涉及的主要知识点: 1. **Java AWT库**: AWT(Abstract Window Toolkit)是...
Java 时钟源码的编写通常涉及以下几个关键点: - **创建时钟对象**: Java 8 引入了`Clock`接口,它是全局时钟的抽象,可以通过`Clock.systemDefaultZone()`或`Clock.systemUTC()`获取系统默认时区或UTC时钟。 - **...
在这个项目中,我们将讨论如何利用Java语言来创建一个实时更新的数字时钟,显示电脑的当前时间。 首先,我们需要导入相关的Java库。在Java中,`java.time` 包提供了处理日期和时间的类。我们要用到的主要类是 `...
"JAVA语言时钟源码"这个标题指的是使用Java来实现的时钟功能的代码示例。这些源码文件可能是为了教学目的,帮助初学者理解如何在Java中处理时间或创建用户界面。 `MyClock.java`和`DigitalClock.java`可能分别代表...
总之,这个"java图形界面时钟"项目展示了Java GUI编程的基本原理和技巧,包括窗口和组件的设计、图形绘制、时间处理以及定时器的应用。通过优化代码,可以进一步提高时钟的准确性和视觉效果,使之成为一个优秀的桌面...
在Java编程语言中,创建一个时钟应用涉及到对时间的获取、处理和显示。这个过程主要依赖于Java的标准库类`java.util.Calendar`和`java.time`包中的类。下面我们将详细探讨如何利用这些类来编写一个时钟代码。 首先...
在Java编程语言中,创建一个实时小时钟程序是一项基础但重要的练习,可以帮助初学者更好地理解线程、时间处理以及GUI(图形用户界面)设计。在这个案例中,我们可以通过以下步骤来实现一个简单的动态时钟: 1. **...
在Java编程语言中,设计一个时钟代码是一个常见的学习任务,它可以帮助初学者理解线程、日期时间API以及用户界面的基本概念。在这个实验中,我们将深入探讨如何创建一个能够实时显示当前时间的Java时钟应用。 首先...
在这个特定的项目“java实现模拟时钟”中,开发者使用Swing构建了一个能够显示当前时间的模拟时钟。Swing提供了一系列组件,如JFrame、JLabel等,可以方便地构建出丰富的用户界面。 1. **Swing基础**: Swing是...
以上代码展示了如何创建一个简单的Java动态时钟。在这个例子中,我们创建了一个`ClockPanel`类,其中包含了定时器和绘图逻辑。在主程序中,我们创建了一个`JFrame`并添加了`ClockPanel`实例。这样,当程序运行时,就...
在这个Java程序中,数字时钟会不断更新,与系统的实际时间保持同步,这意味着它会每隔一秒或更短的时间间隔刷新一次时间显示,确保用户看到的时间是最准确的。 实现这样的功能,Java主要依赖于`java.util.Timer`和`...