TimeUnit.SECONDS.sleep()和sleep区别

刚看到TimeUnit.SECONDS.sleep()方法时觉得挺奇怪的,这里怎么也提供sleep方法?

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

结果一看源码,原来是对Thread.sleep方法的包装,实现是一样的,只是多了时间单位转换和验证,然而TimeUnit枚举成员的方法却提供更好的可读性,这可能就是当初创建TimeUnit时提供sleep方法的原因吧,大家都知道sleep方法很常用,但经常要使用一个常量保存sleep的时间,比如3秒钟,我们代码通常会这样写:

private final int SLEEP_TIME = 3 * 1000; //3 seconds
因为Thread.sleep方法参数接受的毫秒单位的数值,比较下面代码就知道TimeUnit枚举成员的sleep方法更优雅:
TimeUnit.MILLISECONDS.sleep(10);
TimeUnit.SECONDS.sleep(10);
TimeUnit.MINUTES.sleep(10);
Thread.sleep(10);
Thread.sleep(10*1000);
Thread.sleep(10*60*1000);
但使用TimeUnit枚举成员的sleep方法会不会带来性能损失了,毕竟增加了函数调用开销?
测试测试吧:
import java.util.concurrent.TimeUnit;
public class TestSleep {public static void main(String[] args) throws InterruptedException {      sleepByTimeunit(10000);sleepByThread(10000);     }private static void sleepByTimeunit(int sleepTimes) throws InterruptedException {long start = System.currentTimeMillis();for(int i=0; i<sleepTimes; i++){TimeUnit.MILLISECONDS.sleep(10);}long end = System.currentTimeMillis();System.out.println("Total time consumed by TimeUnit.MILLISECONDS.sleep : " + (end - start));}private static void sleepByThread(int sleepTimes) throws InterruptedException {long start = System.currentTimeMillis();for(int i=0; i<sleepTimes; i++){Thread.sleep(10);}long end = System.currentTimeMillis();System.out.println("Total time consumed by Thread.sleep : " + (end - start));}
}

两次测试结果(Win7+4G+JDK7 测试期间计算资源充足):
Total time consumed by TimeUnit.MILLISECONDS.sleep : 100068
Total time consumed by Thread.sleep : 100134
Difference : – -66
Total time consumed by TimeUnit.MILLISECONDS.sleep : 100222
Total time consumed by Thread.sleep : 100077
Difference : – +145

从结果可以看出10000次调用差异很小,甚至一次更快,不排除JVM进行了优化,如果忽略性能方面考虑,从可读性方面建议使用TimeUnit枚举成员的sleep方法。
另外TimeUnit是枚举实现一个很好的实例,Doug Lea太神了,佩服得五体投地!
出处:
http://stevex.blog.51cto.com/4300375/1285767

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++11并发指南系列

https://www.cnblogs.com/haippy/archive/2013/08/27/3284540.html

hashmap另一种初始化

代码&#xff1a; new HashMap<String,Integer>() {{put("a", 0);put("b", 0);put("c", 0);}}; 用处&#xff1a; for (Entry<String, String> entry : set) {value entry.getValue();try {if(k 5) {break;}json new JSONObjec…

怎么去阅读这本书

最近打算对并发编程和网络编程进行一定深度的学习&#xff0c;

理解 shared_ptr实现copy-on-write(COW)

转自&#xff1a;http://blog.csdn.net/zhangxiao93/article/details/52792888 shared_ptr实现COW&#xff08;Copy-On-Write&#xff09; 前不久在《Linux多线程服务端编程使用muduoC网络库》2.8节看到这个内容&#xff0c;一直没有真正理解&#xff0c;后来在书中7.3中再次提…

window连接不上ssdb的问题

window上访问虚拟机ssdb 1&#xff09;首先要修改ssdb 的配置文件ssdb.conf&#xff0c;修改server的节点下ip如下&#xff1a; server节点下的ip意思是绑定哪个ip地址能够访问服务 &#xff0c;也就是说只能通过的ip可以访问ssdb server。 ps&#xff1a; 127.0.0.1 //绑定…

分布式系统的工程化开发方法

转自&#xff1a;http://blog.csdn.net/solstice/article/details/5950190 以下是我在珠三角技术沙龙 2010Q4 上的演讲投影片。 演讲视频&#xff1a; http://www.youku.com/playlist_show/id_5238686.html ---------- ---------- ------

java操作ssdb:set、map、list..

网上收集的代码模板&#xff1a; import com.udpwork.ssdb.*;/** * SSDB Java client SDK demo. */ public class Demo { public static void main(String[] args) throws Exception { SSDB ssdb null; Response resp; byte[] b; ssdb new SSDB("127.0.0.1", 8888…

程序员的知识广度

转自&#xff1a;http://blog.csdn.net/EGEFCXzo3Ha1x4/article/details/79070190 “知识变现”的口号一喊 确实让很多人都摩拳擦掌蓄势待发 那么作为程序员的mu们 不管是思维逻辑&#xff0c;还是知识广度 是不是都迫不及待了 今天&#xff0c;我们也来测试下 【单选题】 1 …

【转载】RocketMQ优秀文章

rocketMq详解&#xff1a;http://blog.csdn.net/column/details/learningrocketmq.html rocketMq实践&#xff1a;https://pan.baidu.com/s/1kTXE4PD rocketMq的原理&#xff1a;https://pan.baidu.com/s/1bogcpgN rocketMq用户指南&#xff1a;https://pan.baidu.com/s/1kT…

多线程---条件变量

互斥器和条件变量的区别&#xff1a;互斥器具有加锁原语&#xff0c;用来进行排他性的访问共享数据&#xff0c;而条件变量具有等待原语&#xff0c;用于等待某个事件的发生。 等待条件变量的正确姿势&#xff1a; void wait() {mutex.lock()while (wait_flag false) {conditi…

ngnix安装

一、安装Nginx&#xff1a; 1 : wget下载: http://nginx.org/download/nginx-1.4.2.tar.gz 2 : 进行安装&#xff1a; tar -zxvf nginx-1.6.2.tar.gz 3 : 下载锁需要的依赖库文件&#xff1a; yum install pcre yum install pcre-devel yum install zlib yum install zl…

ARP-地址解析协议(在实践中深入理解ARP协议)

在同一个网络&#xff08;无特别说明&#xff0c;均指以太网络&#xff09;中进行通信的主机&#xff0c;必须要拥有目标主机的MAC地址才能够正确地将数据发送给目标主机&#xff0c;那么如何知道目标主机的MAC地址呢&#xff1f;可以通过ARP协议。ARP协议就是用来获取目标IP地…

Maven私服

1 Maven私服简介 Maven 私服是一种特殊的Maven远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远程仓库&#xff08;中央仓库、其他远程公共仓库&#xff09;。 1.1 下载构件顺序 建立私服后&#xff0c;当局域网内的用户需要某个构件时&a…

nginx配置文件中参数的作用

####默认的nobody&#xff0c;没有访问目录权限&#xff0c;然后指定有权限的用户 ####user nobody; ####一般一个进程足够了&#xff0c;你可以把连接数设得很大。 ####如果有SSL、gzip这些比较消耗CPU的工作&#xff0c;而且是多核CPU的话&#xff0c;可以设为和CPU的数量一…

TCP/IP协议--ARP协议(有了IP地址为什么还需要ARP协议)

首先我们需要先大致了解一下MAC地址&#xff0c;MAC&#xff08;Media Access Control, 介质访问控制&#xff09;地址是烧录在Network Interface Card(网卡,NIC)里的,也叫硬件地址,是由48比特长(6字节),16进制的数字组成.0-23位叫做组织唯一标志符(organizationally unique &a…

Unity3d--跨平台(一)

转自&#xff1a;https://www.cnblogs.com/murongxiaopifu/p/4211964.html前言&#xff1a; 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇。到底是什么原理使得U3D可以跨平台呢&#xff1f;后来发现了Mono的作用&#xff0c;并进一步了解到了CIL的存在。所以&#xff0…

linux定时任务的用法详解

crontab的基本格式&#xff1a; f1  f2  f3  f4  f5  command 分  时 日  月  周  命令 第一列f1代表分钟1~59&#xff1a;当f1为表示每分钟都要执行&#xff1b;为/n表示每n分钟执行一次&#xff1b;为a-b表示从第a分钟到第b分钟这段时间要执行&#xff1b;为a,…

Unity3d-跨平台(二)

转自&#xff1a;http://www.jiandaima.com/blog/archives/945.html 是如何输出到多平台的&#xff1f; 我的第一篇文章&#xff0c;选择了一个不那么简单的主题&#xff0c;但是是我近期比较感兴趣的。这周&#xff0c;我和一个朋友&#xff0c;谈到了游戏开发和Unity3D&#…

lua的作用

轻量级: 它用标准C语言编写并以源代码形式开放&#xff0c;编译后仅仅一百余K&#xff0c;可以很方便的嵌入别的程序里。 可扩展: Lua提供了非常易于使用的扩展接口和机制&#xff1a;由宿主语言(通常是C或C)提供这些功能&#xff0c;Lua可以使用它们&#xff0c;就像是本来就内…

Almost Arithmetical Progression

Description Gena loves sequences of numbers. Recently, he has discovered a new type of sequences which he called an almost arithmetical progression. A sequence is an almost arithmetical progression, if its elements can be represented as: a1  p, where p i…