`

TimeUnit

阅读更多

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 文件实时监听watchService

    - `WatchKey key = watcher.poll(3, TimeUnit.SECONDS);` - `key.pollEvents()` `WatchKey`是`WatchService`的核心,它表示一个注册的目录。`poll()`方法用于获取下一个可用的`WatchKey`,如果没有事件,会返回`...

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

    在Java编程中,计算两个给定日期之间的天数差是一项常见的任务,这涉及到日期和时间的处理。Java提供了多种方式来解决这个问题,包括使用`java.util.Date`、`java.util.Calendar`类,以及从Java 8开始引入的`java....

    java线程池概念.txt

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

    jfinalpluginsjfinal-dreampie.zip

    .scheduler().scheduleOnce(Duration.create(1000, TimeUnit.MILLISECONDS),  new Runnable() {  @Override  public void run() {  //do Something  }  }, Akka.system().dispatcher()); 5....

    Java线程池.docx

    public ScheduledFuture<?> scheduleWithFixedDelay(Callable<V> callable, long initialDelay, long delay, TimeUnit unit); ``` 在上面的示例代码中,我们使用了scheduleAtFixedRate方法来执行定时任务。

    仅使用TextView高仿京东淘宝各种APP活动倒计时样式Demo

    long seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(minutes); String timeString = String.format("%02d天 %02d小时 %02d分钟 %02d秒", days, hours, minutes,...

    Java8的高性能缓存库caffeine.zip

    Caffeine 是基于Java 8的高性能,接近最佳的缓存... .expireAfterWrite(5, TimeUnit.MINUTES)  .refreshAfterWrite(1, TimeUnit.MINUTES)  .build(key -> createExpensiveGraph(key)); 标签:caffeine

    java 记录程序执行的时间

    TimeUnit.MILLISECONDS.convert(elapsedTimeNanos, TimeUnit.NANOSECONDS); System.out.println("程序运行时间: " + elapsedTime + " 毫秒"); ``` 此外,Java的`Stopwatch`类(在第三方库如Guava中提供)也是一种...

    银行业务调度系统

    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 ...

    仅使用TextView高仿京东淘宝各种APP活动倒计时样式

    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))); TextView countdownTextView = findViewById(R.id.countdown_textview); countdownTextView.setText(timeFormat); } @...

    测试时间的算法

    long durationInMillis = TimeUnit.MILLISECONDS.convert(durationInNanos, TimeUnit.NANOSECONDS); System.out.println("someMethod() 执行时间为: " + durationInMillis + " 毫秒"); } public void ...

    QT播放pcm音频文件(自带音频文件,可直接运行)

    QT框架是Qt公司开发的一款强大的跨平台应用程序开发框架,它广泛应用于GUI(图形用户界面)设计,同时也支持命令行和其他非GUI应用。在本实例中,我们关注的是使用QT来播放PCM(脉冲编码调制)音频文件。...

    序列化性能测试JAVA

    @Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS) @Fork(1) @State(Scope.Benchmark) public class SerializationBenchmark { private MyObject obj; @Setup public void setup() { // ...

    Spring使用timer定时器-能精确几点运行定时任务

    TimeUnit timeUnit = TimeUnit.MILLISECONDS; timerConfig.startTimerTask(scheduledTime, period, timeUnit); } ``` 通过这种方式,你可以精确地在指定的时间启动定时任务,并根据需要设置任务间隔。请注意,`...

    计算日期差

    - `TimeUnit`方法:使用`TimeUnit.between`方法可以直接计算两个日期间的差值,单位可以是天、小时等。例如: ```java long diffInMilliseconds = Math.abs(date2.getTime() - date1.getTime()); long daysDiff ...

    ScheduledExecutorService 计时器任务处理

    2. `scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)`: 此方法会周期性地执行任务,首次执行会在`initialDelay`后开始,然后每隔`period`时间间隔执行一次。`period`参数...

    令牌桶Java实现

    public TokenBucket(int maxTokens, long refillRate, TimeUnit timeUnit) { this.maxTokens = maxTokens; this.refillRate = timeUnit.toMillis(refillRate); scheduler = Executors....

    Android悬浮窗计时器

    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)))); } @Override public void onFinish() { yourCustomView.setText("Time's up!"); } } ``` 在这个例子中,每当计时器倒...

    Android代码-RetrofitCache

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

Global site tag (gtag.js) - Google Analytics