`
kuyuyingzi
  • 浏览: 53500 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

优先使用TimeUnit类中的sleep()

 
阅读更多

TimeUnit是什么?

TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep(),在很长一段时间里Thread的sleep()方法作为暂停线程的标准方式,几乎所有Java程序员都熟悉它,事实上sleep方法本身也很常用而且出现在很多面试中。如果你已经使用过Thread.sleep(),当然我确信你这样做过,那么你一定熟知它是一个静态方法,暂停线程时它不会释放锁,该方法会抛出InterrupttedException异常(如果有线程中断了当前线程)。但是我们很多人并没有注意的一个潜在的问题就是它的可读性。Thread.sleep()是一个重载方法,可以接收长整型毫秒和长整型的纳秒参数,这样对程序员造成的一个问题就是很难知道到底当前线程是睡眠了多少秒、分、小时或者天。看看下面这个Thread.sleep()方法:

1
Thread.sleep(2400000

粗略一看,你能计算出当前线程是等待多长时间吗?可能有些人可以,但是对于大多数程序员来说这种写法的可读性还是很差的,你需要把毫秒转换成秒和分,让我们来看看另外一个例子,这个例子比前面那个例子可读性稍微好一点:

1
Thread.sleep(4*60*1000);

这比前面那个例子已经好多了,但是仍然不是最好的,你注意到睡眠时间用毫秒,不容易猜出当前线程将等待4分钟。TimeUnit类解决了这个问题,通过指定DAYS、HOURS、MINUTES,SECONDS、MILLISECONDS和NANOSECONDS。java.utils.concurrent .TimeUnit 是Java枚举应用场景中最好的例子之一,所有TimeUnit都是枚举实例,让我们来看看线程睡眠4分钟用TimeUnit是如何使用的。

1
TimeUnit.MINUTES.sleep(4); // sleeping for 1 minutes

类似你可以采用秒、分、小时级别来暂停当前线程。你可以看到这比Thread的sleep方法的可读的好多了。记住TimeUnit.sleep()内部调用的Thread.sleep()也会抛出InterruptException。你也可以查看JDK源代码去验证一下。下面是一个简单例子,它展示如果使用TimeUnit.sleep()方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
*
* Java program to demonstrate how to use TimeUnit.sleep() method in Java.
* TimeUnit is a new way of introducing pause in Java program.
* @author Javin
*/
public class TimeUnitTest {
public static void main(String args[]) throws InterruptedException {
System.out.println("Sleeping for 4 minutes using Thread.sleep()");
Thread.sleep(4 * 60 * 1000);
System.out.println("Sleeping for 4 minutes using TimeUnit sleep()");
TimeUnit.SECONDS.sleep(4);
TimeUnit.MINUTES.sleep(4);
TimeUnit.HOURS.sleep(1);
TimeUnit.DAYS.sleep(1);
}
}

除了sleep的功能外,TimeUnit还提供了便捷方法用于把时间转换成不同单位,例如,如果你想把秒转换成毫秒,你可以使用下面代码:

1
TimeUnit.SECONDS.toMillis(44)

它将返回44,000

TimeUnit vs Thread.sleep()

目前我们讨论使用TimeUnit的好处是提高了可读性,但是有时候觉得其他方法更好,因为Thread.sleep()伴随java很早就出现了,几乎所有程序员都知道Thread.sleep(),都知道是将当前线程暂停,而对TimeUnit并不太熟悉。两个原因:一是对比起Thread.sleep(),TimeUnit不是很常用,第二是在它不在Thread类中,就像wait和notify同样不是在Thread中,反正这些需要一段时间才能被采用,并成为一个标准的方式。

总结来说在你想用Thread.sleep()方法的地方你最好使用TimeUnit.sleep()方法来代替。它不尽可以提高代码的可读性而且能更加熟悉java.util.concurrent包,因为TimeUnit在并发编程中也是一个关键API。

原文链接:http://www.importnew.com/7219.html

分享到:
评论

相关推荐

    用JAVA做两个给定时间的天数差

    用JAVA做两个给定时间的天数差

    线程超时死掉

    参数timeout指定超时时间,uint指定时间的单位,在枚举类TimeUnit中有相关的定义。如果计 算超时,将抛出TimeoutException Future的实现类有java.util.concurrent.FutureTask即 javax.swing.SwingWorker,V>。通常...

    JAVA接口性能测试源码

    // TimeUnit.MILLISECONDS.sleep(200); //休眠200ms // } catch (InterruptedException e) { // e.printStackTrace(); // } 然后再将下面的判断交易状态的判断条件 改成 if(1==1) (3)、执行main方法就可以进行...

    TimeInterval:TimeInterval它是一个Java proyect,可以在几个星期,两个星期,两个月,两个月,三个月和一个学期的时间间隔内工作

    每个时间单位都有一个开始日期和结束日期,以及一个单位名称**和说明**(**对于此版本,以西班牙语为标准) 对于间隔的集中处理,请使用CalculateIntervals类中的方法例如,要获取两个给定日期之间的星期列表,该...

    Lock锁的底层原理完整版

    在实际使用场景中,例如多个用户同时操作一个银行账户的情况,就可以使用Lock锁进行线程同步,确保每次只有一个用户能进行操作。总的来说,Lock锁是Java多线程编程中的重要工具,能够有效保障程序运行的正确性和稳定...

    java8日期相关类

    TimeUnit、Instant、LocalDate 、LocalDateTime、Duration.between、DateTimeFormatter、firstDayOfMonth()、after、before等日期处理

    myths-about-java:这个项目是出于对Java的“本地”开发人员的沮丧而开始的

    关于java的神话 这个项目是出于对Java的“本地”开发人员的沮丧而开始的 内存消耗 纯Java 由阻塞2分钟的一个“哑”主类组成 package org.deer.java8.... sleep( 2 ); } } Java 8 默认启动参数 最小参数(-Xms1m -Xm

    CyclicBarrier用法.docx

    CyclicBarrier是Java中的一个同步工具类,用于协调多个线程之间的同步。它的作用类似于CountDownLatch,可以让一个或多个线程等待其他线程执行完毕后再继续执行。 CyclicBarrier可以被看作是一个屏障,当所有线程都...

    Java8的高性能缓存库caffeine.zip

    Caffeine使用Google Guava启发的API提供内存缓存。 改进取决于您设计Guava缓存和ConcurrentLinkedHashMap的体验。LoadingCache, Graph> graphs = Caffeine.newBuilder()  .maximumSize(10_000)  ....

    java中redis锁的封装

    Object result = redisLockTemplate.execute("REDIS:LOCK:" + id, 1, TimeUnit.SECONDS, new Callback() { @Override public Object onGetLock() throws InterruptedException { //拿到锁,进行处理,返回结果...

    第7章-JUC多线程v1.1.pdf

    (传入的对象实现了Runnable接口, 这就解释了: 为什么实现多线程的方式中继承Thread类不能使用线程池了) 执行过程: 首先判断任务是否为空, 为空抛出空指针异常, 否则执行下一个判断: 当前线程数量是否小于核心...

    JAVA Lock加锁实例

    Lock锁是对象锁,仅在同一对象中,锁才会生效。(不做论证) (以下场景皆为单例模式下运行) lock.lock()的加锁方式,会使后续请求的线程堵塞等待。(方案A) lock.tryLock()的加锁方式,不会堵塞,会立即返回加锁...

    java线程池概念.txt

    unit:参数keepAliveTime的时间单位,有7种取值,在TimeUnit类中有7种静态属性(时间单位) workQueue:一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,...

    zookeeper-cluster-recconect-test

    区别如下: 对于动物园管理员:TRICKY 基本上不支持重新连接,除非手动设计并添加CountDownLatch(n),并使用经过精心调整的TimeUnit.Seconds.sleep(n)的For循环。 所有这些措施将导致使用的复杂性。 对

    Android OKHttp3拦截器的使用方法

    在上一篇中我们已经知道了okhttp的基本使用,其中在介绍OkHttpClient初始化的时候,介绍了两种方式,第二种方式就可以对这个OkHttpClient对象设置拦截器,如下所示: // 配置一些信息进入OkHttpClient ...

    java对大数据的处理.pdf

    //建⽴⼀个线程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor( minTaskNumber, maxTaskNumber, 3L, TimeUnit.SECONDS, new ArrayBlockingQueue(minTaskNumber), new ThreadPoolExecutor....

    Java ExcutorService优雅关闭方式解析

    关闭时可使用如下代码 public static void waitUntilTerminate(final ExecutorService executorService, final int timeout) { try { executorService.shutdown(); if (!executorService.awaitTermination(time...

    Android代码-RetrofitCache

    RetrofitCache English RetrofitCache让retrofit2 okhttp3 rxjava 配置缓存...@Cache(time = 20,timeUnit = TimeUnit.MINUTES) @GET("users") Observable test(); 默认时间缓存,默认是0秒 @Cache() @GET("users

    Java分布式应用学习笔记07线程池应用

    Java分布式应用学习笔记07线程池应用

    银行业务调度系统

    import java.util.concurrent.TimeUnit; public class Mainlass { public Mainlass() { } public static void main(String[] args) { ServiceWindow vipWindow; for(int i = 1; i ; ++i) { vipWindow = new ...

Global site tag (gtag.js) - Google Analytics