15

小知识:分不清的时间 nanoTime(),currentTimeMillis(),uptimeMillis() ...

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ%3D%3D&%3Bmid=2650833778&%3Bidx=1&%3Bsn=364bebdaf409095cfb4d9cbd483a6d8c
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文作者

作者: IT互联网大叔

链接:

https://juejin.im/post/6844904147628589070

本文由作者授权发布。

稳住,今天是周末,科普 2 分钟完毕。

今天的主题,从头到尾就两个字:时间。

坚持看完整篇blog,一定会有收获。

开发中经常要用到时间戳,下面将会详细介绍,如下系统函数的功能和差异 :

  • System.nanoTime()

  • System.currentTimeMillis()

  • SystemClock.uptimeMillis()

  • SystemClock.elapsedRealtime()

  • SystemClock.currentThreadTimeMillis

0

时间的单位

秒:second

毫秒:Millisecond

微妙:Microsecond

纳秒:nanosecond

1秒 = 1000毫秒;1毫秒=1000微秒, 1微秒=1000纳秒

注意:【纳秒的单位千万别弄错了,马上我们就会用到这个单位】

1毫秒 = 1000 000纳秒;一百万纳秒

1

System.nanoTime()

单位:纳秒

  1. android系统开机到当前的时间

  2. 系统设置修改时钟,不影响该时间

  3. 重启android系统后该值会重置为0

2

System.currentTimeMillis()

单位:毫秒(milliseconds)

  1. 从1970.1.1 UTC 零点开始到当前的时间

  2. 修改系统时钟,会直接修改该时间,可以通过该值推算当前系统时钟的日期和时间

  3. 重启手机对该时间无影响

3

System.nanoTime()有什么用呢?

System.nanoTime:返回的时间单位是纳秒,是毫秒的百万分之一。远比毫秒的颗粒度要低。

如下情况,使用,System.currentTimeMillis,计算不出时间差,但是System.nanoTime可以:

public class TimeStampMain {

    public static void main(String[] args) {
        long milliTimeBegin = System.currentTimeMillis();
        long nanoTimeBegin = System.nanoTime();
        for (int i = 0; i < 200; i++){

        }
        long nanoDuration = System.nanoTime() - nanoTimeBegin;
        long milliDuration = System.currentTimeMillis() - milliTimeBegin;

        System.out.println("循环100次消耗的时间:nanoDuration=" + nanoDuration + "纳秒, milliDuration=" + milliDuration + "毫秒");
    }
}
v2ieyiB.jpg!mobile

4

SystemClock

4.1 相关方法

long uptimeMillis()

单位:毫秒

单位:毫秒

系统重启后将重0开始计算,android系统进入深度睡眠后将会暂停计时

long elapsedRealtime()

单位:毫秒
系统重启后将重新开始计算,android系统进入深度睡眠,不会停止计时。

long currentThreadTimeMillis();

单位:毫秒

线程running的时间,线程Sleep的时间不会计入。

4.2 SystemClock.currentThreadTimeMillis() 测试

注意currentThreadTimeMillis()返回的是当前线程running的时间,注意是running的时间。我们通过如下例子来理解什么叫running的时间。并且单位是毫秒。

new Thread(){

  @Override

  public void run() {

    try {
      Log.w(TG, "currentThreadTimeMillis1=" + SystemClock.currentThreadTimeMillis());//日志1
      Thread.sleep(20000);//20s
      Log.w(TG, "currentThreadTimeMillis2=" + SystemClock.currentThreadTimeMillis());//日志2
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

  }

}.start();

你猜,日志输出currentThreadTimeMillis1=?currentThreadTimeMillis2=?

输出日志:

5

结尾

再次回到我们的主题,时间。

大叔,有一次面试“某福报厂”,面试官问了一个问题,让我陷入沉思了很久很久很久……以下是面试官的原话:

在我们公司,有着很多的学霸,假如,你加入我们之后,你会发现很多来自国内外名校,智商很高的同事。他们学习能力很强。你怎么能做到不落后甚至超越他们呢?

大叔,思考了很久很久,终于找到了适合大叔的答案:时间.

程序员,面对快速迭代的技术,持续学习的能力无疑是杀手锏,短时间我们学习的速度赶不上学霸,但是持之以恒的学习,一个个技术细节慢慢啃,夜以继日的啃,不敢说能赶上大部分学霸,最起码能让研发能力领先在中上水平以上。随着时间的力量,这个领先会越来越领先。时间可以是把杀猪刀,时间也可以是把屠龙刀。

逝者如斯夫,我相信时间的力量,坚持的力量。

积跬步,终将至千里;积小流,必成江海。

最后推荐一下我做的网站,玩Android:  wanandroid.com ,包含详尽的知识体系、好用的工具,还有本公众号文章合集,欢迎体验和收藏!

推荐阅读

直面底层:这一次,彻底搞懂Android 中的Window

看我一波,代码优化到极致的操作!

这效果炸了,网易云音乐“宇宙尘埃”特效

vEVjqa7.jpg!mobile

扫一扫  关注我的公众号

如果你想要跟大家分享你的文章,欢迎投稿~

┏(^0^)┛明天见!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK