java并发之TimeUnit,代替 TimeUnit.sleep()
TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep().
在很长一段时间里Thread的sleep()方法作为暂停线程的标准方式。
Thread.sleep() 可读性差
Thread.sleep()方法:
Thread.sleep(2400000)
对于大多数程序员来说这种写法的可读性很差的,你需要把毫秒转换成秒和分。
Thread.sleep(4*60*1000);
这比前面那个例子已经好多了,但是仍然不是最好的,你注意到睡眠时间用毫秒,不容易猜出当前线程将等待4分钟。
TimeUnit类解决了这个问题,通过指定DAYS、HOURS、MINUTES,SECONDS、MILLISECONDS和NANOSECONDS。
用TimeUnit写线程睡眠4分钟:
TimeUnit.MINUTES.sleep(4); // sleeping for 4 minutes
类似你可以采用秒、分、小时级别来暂停当前线程。你可以看到这比Thread的sleep方法的可读的好多了。
为什么对TimeUnit并不太熟悉
两个原因:
一是对比Thread.sleep(),TimeUnit不是很常用,
二是在它不在Thread类中,就像wait和notify同样不是在Thread中,反正这些需要一段时间才能被采用,并成为一个标准的方式。
TimeUnit 常用的颗粒度
TimeUnit.DAYS 日的工具类
TimeUnit.HOURS 时的工具类
TimeUnit.MINUTES 分的工具类
TimeUnit.SECONDS 秒的工具类
TimeUnit.MILLISECONDS 毫秒的工具类
TimeUnit.SECONDS.sleep( 5 ); //延时5秒
**
TimeUnit 时间颗粒度转换 **
TimeUnit.SECONDS.toMillis(1) // 1秒转换为毫秒数
TimeUnit.SECONDS.toMinutes(60) // 60秒转换为分钟数
TimeUnit.SECONDS.sleep(5) // 线程休眠5秒
TimeUnit.SECONDS.convert(1, TimeUnit.MINUTES) // 1分钟转换为秒数
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) {
//1天有24个小时 1代表1天:将1天转化为小时
System.out.println( TimeUnit.DAYS.toHours( 1 ) );
//结果: 24
//1小时有3600秒
System.out.println( TimeUnit.HOURS.toSeconds( 1 ));
//结果3600
//把3天转化成小时
System.out.println( TimeUnit.HOURS.convert( 3 , TimeUnit.DAYS ) );
//结果是:72
}
}