线程休眠只会用 Thread.sleep?来,教你新姿势!
线程休眠是 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 多线程系列干货文章。
觉得有用,转发分享下朋友圈给更多的人看吧~
最近干货分享
点击「阅读原文」加入栈长的战队~
线程休眠只会用 Thread.sleep?来,教你新姿势!的更多相关文章
- 线程休眠只会用Thread.sleep?那你就弱爆了!
线程休眠是 Java 开发经常会用到的一个手段,就是让当前线程睡一会儿,睡醒之后再继续运行. 咱大多数程序员,多线程虽然学得不好,但线程休眠,无人不知,无人不晓,也都会用,不就是用 Thread.sl ...
- Android线程管理(三)——Thread类的内部原理、休眠及唤醒
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- Android线程管理(三)——Thread类的内部原理、休眠及唤醒
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- 【多线程】线程休眠 Thread.sleep()
线程休眠 Thread.sleep() sleep (时间) 指定当前线程阻塞的毫秒数: sleep存在异常InterruptedException: sleep时间达到后线程进入就绪状态: slee ...
- Android中使用ListView实现分页刷新(线程休眠模拟)
当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...
- Java多线程系列--“基础篇”07之 线程休眠
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
- java多线程系类:基础篇:07线程休眠
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
- Android中使用ListView实现分页刷新(线程休眠模拟)(滑动加载列表)
当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...
- [Swift]两种线程休眠的方式
一.线程休眠方式1 [Swift]与[C#]的比较: //C#:需要添加using System.Threading; //线程休眠3000毫秒,即3秒 Thread.Sleep(); //Swift ...
随机推荐
- MongoDB与关系数据库的对比
MongoDB与关系数据库的对比
- ES6——面向对象-基础
面向对象原来写法 类和构造函数一样 属性和方法分开写的 // 老版本 function User(name, pass) { this.name = name this.pass = pass } U ...
- jQuery学习总结02-属性
1.attr(name|properties|key,value|fn) 说明:设置和返回被选元素的属性值 示例: 参数: name(属性名称) string properties(作为属性的'名/值 ...
- React-请求篇
请求方式: (1)后台API:HttpPost [FromForm] UserRetisterDTO dto 前端请求: { body:qs.stringify(dto), header ...
- VUE CLI3.X 创建项目
Node.js环境搭建 Node.js基于V8引擎,可以让js代码脱离浏览器运行 Vue CLI3.0 需要Node.js 8.9或者更高版本. 用nvm或者nvm-windows在同一台电脑中管理多 ...
- Linux--shell交互输入与循环语句--06
一.交互输入 1.命令用法:read a b c -> aa bb cc read命令同时可以定义多个变量值:而输入的内容默认以空格为分隔符,将值输入到对应的变量中:如果默认值输入过多,最后 ...
- Sumdiv(约数和问题)
题目地址 看到这题的题解,大佬都说是小学奥数,蔡得我不敢鸡声. 求 \(a^b\) 所有的约数之和 mod \(9901\) \((1<=a,b<=5*10^7)\) 题解 做这道题,我还 ...
- web应用,http协议简介,web框架
一.web应用 web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端 ...
- 四-2、Move、fix、unfix命令
1.Move命令--移动命令 1.对应的菜单和工具栏 2.以移动单个器件为例(以推荐的操作步骤进行操作)(具体步骤如下) 1--光标位于元件的原点 2--光标位于元件的几何中心 3--光标位于鼠标单击 ...
- 【转】Django 基本命令
Django 基本命令 1. 新建一个 django project django-admin.py startproject project_name 特别是在 windows 上,如果报错,尝试用 ...