线程休眠是 Java 开发经常会用到的一个手段,就是让当前线程睡一会儿,睡醒之后再继续运行。

咱大多数程序员,多线程虽然学得不好,但线程休眠,无人不知,无人不晓,也都会用,不就是用 Thread.sleep 方法嘛!而且还将它用到那么绝,之前不是还有人写过休眠排序算法和休眠取时间的算法,再来回味下这么脑洞大开的两个算法:

笑过之后,当然,这不是咋今天要讲的主题,栈长今天要讲的是如何更优雅的让线程休眠。

来看下面的休眠程序:

Thread.sleep(87000000);

你知道休眠多久吗?

醉了……

再把上面的稍微改装下:

Thread.sleep(24 * 60 * 60 * 1000 + 10 * 60 * 1000);

现在你估计大概能知道休眠多久了,但还是很茫然,很无助,不写注释,谁知道休眠多久?单位还是毫秒。。

其实就是休眠 24 小时 10 分钟,何必整这么麻烦呢?

优雅又简单的方式来了:

TimeUnit.DAYS.sleep(1);
TimeUnit.MINUTES.sleep(10); 或者  TimeUnit.HOURS.sleep(24);
TimeUnit.MINUTES.sleep(10);

使用 java.util.concurrent.TimeUnit 类就可以优雅的搞定,不需要过多的单位运算及修饰,是不是很优雅,很简单?

上面演示了 HOURS、MINUTES,还有更多的枚举可以用。

来看下 TimeUnit 的详细方法和枚举值:

其实 TimeUnit 还可以用来做时间单位转换,TimeUnit 提供了各种丰富的时间单位转换方法。

我们随便来看一个枚举值:

MINUTES {
    public long toNanos(long d)   { return x(d, C4/C0, MAX/(C4/C0)); }
    public long toMicros(long d)  { return x(d, C4/C1, MAX/(C4/C1)); }
    public long toMillis(long d)  { return x(d, C4/C2, MAX/(C4/C2)); }
    public long toSeconds(long d) { return x(d, C4/C3, MAX/(C4/C3)); }
    public long toMinutes(long d) { return d; }
    public long toHours(long d)   { return d/(C5/C4); }
    public long toDays(long d)    { return d/(C6/C4); }
    public long convert(long d, TimeUnit u) { return u.toMinutes(d); }
    int excessNanos(long d, long m) { return 0; }
}

可以很方便的把分钟转换成各种单位的值。

再来看一下 TimeUnit 休眠的原理:

public void sleep(long timeout) throws InterruptedException {
    if (timeout > 0) {
        long ms = toMillis(timeout);
        int ns = excessNanos(timeout, ms);
        Thread.sleep(ms, ns);
    }
}

其实 TimeUnit 的休眠就是调用了 Thread.sleep 休眠方法,哈哈,只是把 Thread.sleep 封装了,这样,用起来很简单方便,也提高了可读性。

大家也可以关注微信公众号:Java技术栈,栈长将继续分享更多 Java 多线程系列干货,在公众号后台回复:多线程,可以获取栈长已经整理好的历史 Java 多线程系列干货文章。

觉得有用,转发分享下朋友圈给更多的人看吧~

最近干货分享

公司不用 Spring Boot,果断离职了!

Java 12 骚操作, switch居然还能这样玩!

Java 12 骚操作, String居然还能这样玩

Spring Boot 1.x 正式退役,2.x大步向前

分享一份 2019 最新 Java 架构师学习资料

点击「阅读原文」加入栈长的战队~

线程休眠只会用 Thread.sleep?来,教你新姿势!的更多相关文章

  1. 线程休眠只会用Thread.sleep?那你就弱爆了!

    线程休眠是 Java 开发经常会用到的一个手段,就是让当前线程睡一会儿,睡醒之后再继续运行. 咱大多数程序员,多线程虽然学得不好,但线程休眠,无人不知,无人不晓,也都会用,不就是用 Thread.sl ...

  2. Android线程管理(三)——Thread类的内部原理、休眠及唤醒

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  3. Android线程管理(三)——Thread类的内部原理、休眠及唤醒

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  4. 【多线程】线程休眠 Thread.sleep()

    线程休眠 Thread.sleep() sleep (时间) 指定当前线程阻塞的毫秒数: sleep存在异常InterruptedException: sleep时间达到后线程进入就绪状态: slee ...

  5. Android中使用ListView实现分页刷新(线程休眠模拟)

    当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...

  6. Java多线程系列--“基础篇”07之 线程休眠

    概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...

  7. java多线程系类:基础篇:07线程休眠

    概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...

  8. Android中使用ListView实现分页刷新(线程休眠模拟)(滑动加载列表)

    当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...

  9. [Swift]两种线程休眠的方式

    一.线程休眠方式1 [Swift]与[C#]的比较: //C#:需要添加using System.Threading; //线程休眠3000毫秒,即3秒 Thread.Sleep(); //Swift ...

随机推荐

  1. 从后台看python--为什么说python是慢的

    python越来越作为一种科学技术研究的语言越来越流行,可是我们经常听到一个问题,python是慢的.那么我们从后台分析一下,为什么python是慢的. python是一种动态类型,解释型语言,它的值 ...

  2. 查询sql server占用内存的情况

    se master go select * from sysperfinfo where counter_name like '%Total Server Memory (KB)%' go

  3. 脚本_统计 Linux 进程相关数量信息

    #!bin/bash#作者:liusingbon#功能:统计 Linux 进程相关数量信息,running(运行的进程),sleeping(睡眠中的进程),stoped(停止的进程),zombie(僵 ...

  4. 解决pycharm运行py文件时只有unittest选项的方法

    有时候在编完脚本开始运行时,发现某个py脚本右键运行的选项不是run,二是run in unittest,试过很多方法都不能很好的去除,主要是因为脚本中含有test字符串,一种解决方法是将脚本中所有的 ...

  5. jmeter post请求在终端传参,并且指定请求参数文件

    命令:jmeter -n -t   jmeter_1.jmx   -l   report/report30.jtl    -Jnum=3000 -e -o   webresult/3000result ...

  6. django之模型类在视图中的应用

    一:模型类直接从把前端表单传入的值,进行存储. @csrf_exempt def regist(request): if request.method == 'POST': form = UserFo ...

  7. 什么是Js原型?(1)(包括作用:继承)

    学习目标:    认识什么js是原型,原型.构成函数.实例对象关系:原型应用范围. 什么是原型    函数有原型,函数有一个属性叫prototype,函数的这个原型指向一个对象,这个对象叫原型对象.这 ...

  8. jmeter接口测试与接口测试工具

    接口测试与接口测试工具 1,什么是接口? 接口,Application Programming Interface(API) 通俗的讲 就是HTTP请求 2,什么是接口测试? 接口测试测试组件间接口的 ...

  9. PB系统颜色值

    Colour Red Green Blue 值黑色 Black 0 0 0 0白色 White 255 255 255 16777215灰色 Gray 192 192 192 12632256深灰色 ...

  10. 【转】iis解决应用程序池**提供服务的进程意外终止进程ID是**。进程退出代码是'0x80'

    转自:http://blog.sina.com.cn/s/blog_56a68d5501013xdd.html 我们公司旗下的红黑互联会遇到这种问题 事件类型: 警告事件来源: W3SVC事件种类: ...