`
m635674608
  • 浏览: 5055333 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

优先使用TimeUnit类中的sleep()

    博客分类:
  • java
 
阅读更多

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

 

原文链接: javarevisited 翻译: ImportNew.com 刘志军
译文链接: http://www.importnew.com/7219.html
转载请保留原文出处、译者和译文链接。]

 

http://www.importnew.com/7219.html

分享到:
评论

相关推荐

    Java编程倒计时实现方法示例

    *sleep()方法:sleep()方法是Thread类中的一个方法,用于使当前线程暂停执行,而这里使用TimeUnit.SECONDS.sleep(1)来设置倒计时间隔为1秒。 二、使用ScheduleExecutor实现 使用ScheduleExecutor可以实现倒计时的...

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

    Java提供了多种方式来解决这个问题,包括使用`java.util.Date`、`java.util.Calendar`类,以及从Java 8开始引入的`java.time`包中的新API。以下将详细介绍如何使用这些方法来计算日期之间的天数差。 1. **使用`java...

    JAVA高级教程实用型

    有两种版本的`sleep()`,一种是直接传入毫秒数,另一种是通过`TimeUnit`类,这提供了一种更清晰的代码表示,例如`TimeUnit.MILLISECONDS.sleep(100)`。需要注意的是,调用`sleep()`可能会抛出`InterruptedException`...

    阿里巴巴java开发手册最终版

    4. **数据类型选择**:推荐优先使用包装类,避免使用基本类型,以适应Java集合框架。避免使用Integer.equals()进行比较,应使用equals()与null的值比较。 5. **集合使用**:推荐使用List而非ArrayList,使用Map而非...

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用

    在上面的示例中,我们使用ThreadPoolExecutor类构造了一个线程池,线程池的corePoolSize为5,maximumPoolSize为10,keepAliveTime为60秒,unit为 TimeUnit.SECONDS,workQueue为ArrayBlockingQueue,handler为...

    在spring boot中使用java线程池ExecutorService的讲解

    在 Spring Boot 中使用线程池非常简单,我们可以使用 @Configuration 注解创建一个线程池配置类,然后使用 @Bean 注解创建一个线程池实例。 ``` @Configuration public class ThreadPoolConfig { @Bean public ...

    时间,字符串常用工具类

    在Java中,可以使用`java.net.Socket`或`java.net.URL`类进行网络通信,而`java.time.ZonedDateTime`或`java.util.concurrent.TimeUnit`可以帮助处理时间的转换和计算。 以上三个工具类都是软件开发中的实用组件,...

    你所不知道的五件事情(并发多线程编程).doc

    例如,你可以使用 `TimeUnit.SECONDS.sleep(10)` 而不是 `Thread.sleep(10000)`,这样使得代码意图更加明确。 2. **CopyOnWriteArrayList**: 这是一个线程安全的列表实现,特别适用于读取频繁而写入较少的情况。在...

    java线程中断之interrupt和stop.docx

    ### Java线程中断机制详解:`interrupt`与`stop`方法 #### 一、引言 在Java多线程编程中,线程控制是至关重要的技术之一。有时我们需要在特定条件...在实际开发中,建议优先考虑使用`interrupt`方法来管理线程的中断。

    Java线程池.docx

    Java线程池 Java线程池是Java语言中的一种高级多线程处理机制,用于避免重复创建和销毁线程而导致额外的性能开销。Java线程池功能可以实现...在上面的示例代码中,我们使用了scheduleAtFixedRate方法来执行定时任务。

    Java并发编程示例(五):线程休眠与恢复

    在这个例子中,`TimeUnit.SECONDS.sleep(1)`等价于`Thread.sleep(1000)`,因为`TimeUnit.SECONDS.sleep(n)`会将秒数转换为毫秒数并调用`Thread.sleep()`。 除了`sleep()`方法,Java还提供了`Thread.yield()`方法,...

    selenium笔记

    在Selenium中,我们可以使用ChromeOptions类来设置指定的浏览器。例如: `ChromeOptions option = new ChromeOptions();` `option.setBinary("D:\\360se6\\Application\\360se.exe");` `WebDriver driver = new ...

    自己封装的OKHttp工具类,粘贴后直调用接

    6. **线程安全**:确保工具类在多线程环境下也能正确工作,通常会使用静态内部类和Singleton模式来实现单例。 【示例代码】: ```java public class OkHttpUtil { private static final OkHttpClient client = ...

    测试时间的算法

    在进行性能测试时,我们通常会使用`java.util.concurrent.TimeUnit`类,它提供了在不同时间单位之间转换的方法。通过结合`System.nanoTime()`和`TimeUnit`,我们可以更方便地计算出时间间隔,并将其转换为更易于理解...

    计算日期差

    2. 使用`Calendar`类或`java.util.concurrent.TimeUnit`类计算差值: - `Calendar`方法:创建`Calendar`实例,设置日期,然后使用`add`方法添加一个日期,再用`get`方法获取差值。例如: ```java Calendar ...

    java线程-Atomic的含义及示例_.docx

    这个包中的类主要用于解决多线程环境中数据的一致性和并发问题,它们通过内部机制确保了操作的原子性,从而避免了显式锁的使用,提高了效率。 #### Atomic类的分类 根据功能的不同,`java.util.concurrent.atomic`...

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

    总结,Spring中使用`Timer`和`TimerTask`来实现精确时间运行的定时任务,虽然比直接使用`@Scheduled`注解稍微复杂一些,但能提供更细粒度的控制。在实际项目中,应根据需求选择合适的方式来实现定时任务。

    Java源码查看线程的运行状态.rar

    线程在Java中由`java.lang.Thread`类表示,其生命周期包括以下几种状态: 1. **新建**(New):当使用`new Thread()`创建了一个线程对象时,线程处于新建状态。 2. **可运行**(Runnable):调用`start()`方法后,...

    监控任务管理器中某个进程的使用情况java编写

    首先,我们可以利用`Runtime`类的`exec()`方法来执行操作系统级别的命令,例如在Windows系统中调用任务管理器的命令行接口`tasklist`来获取进程信息。以下是一个简单的示例: ```java import java.io....

    java中Locks的使用详解

    "Java 中 Locks 的使用详解" 在 Java 中,Locks 是一种非常重要的同步机制,它提供了更加灵活的同步控制。在 Java 5 中,Locks 被引入,以提供更加灵活的同步控制。与 Synchronized Block 相比,Locks 提供了更加...

Global site tag (gtag.js) - Google Analytics