Timeunit与sleep

2024-05-04 21:58
文章标签 sleep timeunit

本文主要是介绍Timeunit与sleep,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 4 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。

这篇关于Timeunit与sleep的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960174

相关文章

shell循环sleep while例子 条件判断

i=1# 小于5等于时候才执行while [ ${i} -le 5 ]doecho ${i}i=`expr ${i} + 1`# 休眠3秒sleep 3doneecho done 参考 http://c.biancheng.net/cpp/view/2736.html

selenium的webdriver三种等待方式(显式等待WebDriverWait+implicitly_wait隐式等待+sleep强制等待)

隐式等待是等页面加载,不是等元素!!! 1、显式等待  一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码。显式等待是等元素加载!!! from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import

java join sleep wait notify notifyAll

sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。  通过调用sleep使任务进入休眠状态,在这种情况下,任务在指定的时间内不会运行。 调用sleep的时候锁并没有被释放。 休眠  Java SE5引入了更加显示的sleep()版本作为TimeUnit类的一部分,这个方法允许你

java线程 yield,sleep,join,synchronized wait notify notifyAll,ReentrantLock lock condition, 生产者消费者

yield,sleep,join yield,join,sleep,join是Thread中的方法,不需要 在synchronized 代码块中调用,和synchronized 没关系,也不会释放锁。 Thread.sleep(100);Thread.yield();Thread t;t.join(); (1)yield()不一定保证让出cpu yield()只是使当前线程重新回

java 注意线程下的 异常捕获,会跳过sleep(10000)休眠,可能会出现死循环

线程 (1)在catch(){} 中的语句要保证不会出现异常,或者catch中的语句再次捕获了异常,    (2) 线程中try中的语句出现异常,会直接跳过try中的sleep,导致不停地循环   (3)线程的while循环中如果不适用try catch 会导致当出现异常时,线程直接挂掉, package com.hlzt.wx.thread;import java.util.Date

65-java中sleep方法和wait方法的区别

‌Java中的sleep()方法和wait()方法的主要区别在于它们的所属类、使用方式、唤醒机制、锁的处理、异常处理以及用途。‌   ‌所属类不同‌:sleep()方法是Thread类的静态方法,可以在任何线程中使用。而wait()方法是Object类的一个实例方法,只能在同步代码块或同步方法中使用。‌12   ‌使用方式不同‌:sleep()方法用于使线程暂停执行指定的时间,不需要任何条件即可

【线程间通信】sleep/wait/notify/notifyAll作用及使用

文章目录 背景wait代码及演示wait、notify代码及演示notifyAll()代码及演示 背景 在多线程开发过程中,由于线程最大的问题就是抢占式执行,随机调度, 因此线程之间执行的先后顺序难以预知。 但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序,让线程主动阻塞,主动放弃CPU,从而控制线程之间的执行顺序 ,去协调完成工作,怎么去控制线程之间的执行

【多线程】并发编程wait和sleep的区别

notyfy、notifyAll、wait的使用:sleep/wait/notify/notifyAll分别有什么作用 背景:之前的博客讲解到了notify的使用,那并发编程的时候,到底该用 sleep还是notify呢?本篇我们来一起梳理一下区别 所属类与方法类型 wait():wait方法是Object类的一个方法。它用于线程间的通信,允许一个线程等待另一个线程的通知(通过no

C# Task.Delay \ Sleep

1.Thread.Sleep()是同步延迟,Task.Delay()是异步延迟。 2.Thread.Sleep()会阻塞线程,Task.Delay()不会。 3.Thread.Sleep()不能取消,Task.Delay()可以。 4.Task.Delay()实质是创建一个运行给定时间的任务,Thread.Sleep()使当前线程休眠给定时间。 Task.Delay()和Thread.Sleep

线程的sleep()方法的简单使用

线程的sleep方法签名位:  public static void sleep(long millis) throws InterruptException,  是静态方法,使目前正在执行的线程休眠millis毫秒 package com.demo;class MyThread implements Runnable{public void run(){ for(int i = 0;