java有两个获取和时间相关的秒数方法,一个是广泛使用的

System.currentTimeMillis()

返回的是从一个长整型结果,表示毫秒。

另一个是

System.nanoTime()

返回的是纳秒。

“纳”这个单位 一般不是第一次见。前几年相当火爆的“纳米”和他是同一级别。纳表示的是10的-9次方。在真空中,光一纳秒也只能传播30厘米。

比纳秒大一级别的是微秒,10的-6次方;然后是就是毫秒,10的-3次方。

纳秒下面还有皮秒、飞秒等。

既然纳秒比毫秒高10的6次方精度,那么他们的比值就应该是10的6次方。然而并非如此。

看下面的代码

public static void main(String[] args) {
long l = System.currentTimeMillis();
Date date = new Date(l);
System.out.println(l);
System.out.println(date);
}

最后输出的当前时间。

大家可能都知道毫秒方法返回的是自1970年到现在的毫秒数。而Java的日期也是如此,所以他俩是等值的。

但是使用纳秒方法的输出可能让我们丈二和尚摸不着头脑:

public static void main(String[] args) {
long l = System.nanoTime();
Date date = new Date(l / 1_000_000);
System.out.println(l);
System.out.println(date);
}

这个输出在不同的机器上可能不一样,我的输出是Fri Jan 02 07:58:38 CST 1970

为什么会这样?

根据纳秒方法的注释:

Returns the current value of the running Java Virtual Machine's high-resolution time source, in nanoseconds.

This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time. The value returned represents nanoseconds since some fixed but arbitrary origin time (perhaps in the future, so values may be negative). The same origin is used by all invocations of this method in an instance of a Java virtual machine; other virtual machine instances are likely to use a different origin.

翻译一下就是:返回当前JVM的高精度时间。该方法只能用来测量时段而和系统时间无关。它的返回值是从某个固定但随意的时间点开始的(可能是未来的某个时间)。不同的JVM使用的起点可能不同。

这样有点恐怖的是我们相同的代码在不同机器运行导致结果可能不同。

所以它很少用来计算。通常都是测量。

下面写一个程序来反映他和毫秒方法的关系。

  Lists.newArrayList(1,2,3,4,5,6,7,8,9).parallelStream().forEach(i -> {
long m = System.currentTimeMillis();
long n = System.nanoTime();
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
long m1 = System.currentTimeMillis();
long n1 = System.nanoTime();
long m0 = m1 - m;
long n0 = n1 - n; System.out.println(i + " -- " + (n0 / m0));
});
}

输出如下:

3 -- 999756
6 -- 1000129
2 -- 999984
4 -- 999868
5 -- 999019
1 -- 999100
8 -- 999768
7 -- 999753
9 -- 1000139

不同的测试可能结果不同,不过可以看到,这个比值大约是10的6次方。

Java的nanoTime()方法的更多相关文章

  1. oracle调用JAVA类的方法

    导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了,  1.操作系统需要拥有支持loadjava命令的jdk.  2.加 ...

  2. Java中的方法应用

    一.如何定义java中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 语法: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 public.protected.priv ...

  3. Java Runtime.availableProcessors()方法

    Java Runtime.availableProcessors()方法用法实例教程.   描述 java.lang.Runtime.availableProcessors() 方法返回到Java虚拟 ...

  4. paip.java OutOfMemoryError 解决方法o33

    paip.java OutOfMemoryError 解决方法o33 java.lang.OutOfMemoryError: Requested # java.lang.OutOfMemoryErro ...

  5. Java读写文件方法总结

    Java读写文件方法总结 Java的读写文件方法在工作中相信有很多的用处的,本人在之前包括现在都在使用Java的读写文件方法来处理数据方面的输入输出,确实很方便.奈何我的记性实在是叫人着急,很多时候既 ...

  6. java调用本地方法的时候报错 could not find the main class:xx.program will exit

    如图所示,当在java调用本地方法的时候报错 我的解决办法是把dll文件放到System.out.println(System.getProperty("java.library.path& ...

  7. 给NSString增加Java风格的方法

    给NSString增加Java风格的方法 文章目录 我实在受不了 NSString 冗长的方法调用了,每次写之前都要查文档.特别是那个去掉前后多余的空格的方法,长得离谱.与之对应的别的语言,拿 jav ...

  8. Java基础——clone()方法浅析

    一.clone的概念 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...

  9. java接口的方法默认都是public abstract类型

    java接口的方法默认都是public abstract类型, 因此我们在编写接口的实现类的时候,方法的实现前面要显式的加上public访问控制符

随机推荐

  1. 百度网盘下载器:SpeedPan2.3.8

    SpeedPan是款百度网盘资源下载工具,下载速度还行(至少比百度网盘快太多了),支持登录百度账号,也支持免登录下载.官网免费版的取消分享了,我从油管上看到了这个软件,分享给大家. 天翼云:https ...

  2. 第三方模块Gulp

    1.第三方模块Gulp 基于node平台开发的前端构建工具. 将机械化操作编写成任务,想要执行机械化操作时执行一个命令,命令任务就能自动执行了.提高开发效率. 1)Gulp使用 ① 使用npm ins ...

  3. mysql创建表分区

    MySQL创建表分区 create table erp_bill_index( id int primary key auto_increment, addtime datetime ); inser ...

  4. Centos7下使用mail发送邮件

    首先检测相关服务是否已安装[root@ProxyServer ~]# rpm -qa|grep mail libreport-plugin-mailx-2.0.9-19.el6.x86_64 mail ...

  5. .net core 和 WPF 开发升讯威在线客服与营销系统:背景和产品介绍

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf-m.shengxunwei.com ...

  6. DG修改SYS用户密码(ORA-16810,ORA-01017)

    修改主库PROD1密码后,查看configuration状态看到以下报错: [oracle@edgzrip1-PROD1 ~]$ dgmgrl sys/oracleDGMGRL for Linux: ...

  7. 容器编排系统之Pod生命周期、健康/就绪状态探测以及资源限制

    前文我们了解了在k8s上的资源标签.标签选择器以及资源注解相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14141080.html:今天我们来聊下k8 ...

  8. SQL注入基本知识点总结

    SQL注入基本知识 information_schema    MySQL 中存储所有数据库名.所有表名.所有字段名的系统数据库叫 information_schema ,这是在 MySQL 数据库初 ...

  9. burpsuite 2020.12.1最新版蓝色版,下载安装破解

    最新版Burpsuite下载破解安装 安装包链接:https://cloud.189.cn/t/qUVzYbuAJzqm(访问码:mw12) 1.首先,我们解压,可以看到解压后的文件夹里有如下文件 2 ...

  10. Latex向上\向下取整语法 及卷积特征图高宽计算公式编辑

    向下\向上取整 在编辑卷积网络输出特征高宽公式时,需用到向下取整,Mark一下. 向下取整 \(\lfloor x \rfloor\) $\lfloor x \rfloor$ 向上取整 \(\lcei ...