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
相关推荐
*sleep()方法:sleep()方法是Thread类中的一个方法,用于使当前线程暂停执行,而这里使用TimeUnit.SECONDS.sleep(1)来设置倒计时间隔为1秒。 二、使用ScheduleExecutor实现 使用ScheduleExecutor可以实现倒计时的...
Java提供了多种方式来解决这个问题,包括使用`java.util.Date`、`java.util.Calendar`类,以及从Java 8开始引入的`java.time`包中的新API。以下将详细介绍如何使用这些方法来计算日期之间的天数差。 1. **使用`java...
有两种版本的`sleep()`,一种是直接传入毫秒数,另一种是通过`TimeUnit`类,这提供了一种更清晰的代码表示,例如`TimeUnit.MILLISECONDS.sleep(100)`。需要注意的是,调用`sleep()`可能会抛出`InterruptedException`...
4. **数据类型选择**:推荐优先使用包装类,避免使用基本类型,以适应Java集合框架。避免使用Integer.equals()进行比较,应使用equals()与null的值比较。 5. **集合使用**:推荐使用List而非ArrayList,使用Map而非...
在上面的示例中,我们使用ThreadPoolExecutor类构造了一个线程池,线程池的corePoolSize为5,maximumPoolSize为10,keepAliveTime为60秒,unit为 TimeUnit.SECONDS,workQueue为ArrayBlockingQueue,handler为...
在 Spring Boot 中使用线程池非常简单,我们可以使用 @Configuration 注解创建一个线程池配置类,然后使用 @Bean 注解创建一个线程池实例。 ``` @Configuration public class ThreadPoolConfig { @Bean public ...
在Java中,可以使用`java.net.Socket`或`java.net.URL`类进行网络通信,而`java.time.ZonedDateTime`或`java.util.concurrent.TimeUnit`可以帮助处理时间的转换和计算。 以上三个工具类都是软件开发中的实用组件,...
例如,你可以使用 `TimeUnit.SECONDS.sleep(10)` 而不是 `Thread.sleep(10000)`,这样使得代码意图更加明确。 2. **CopyOnWriteArrayList**: 这是一个线程安全的列表实现,特别适用于读取频繁而写入较少的情况。在...
### Java线程中断机制详解:`interrupt`与`stop`方法 #### 一、引言 在Java多线程编程中,线程控制是至关重要的技术之一。有时我们需要在特定条件...在实际开发中,建议优先考虑使用`interrupt`方法来管理线程的中断。
Java线程池 Java线程池是Java语言中的一种高级多线程处理机制,用于避免重复创建和销毁线程而导致额外的性能开销。Java线程池功能可以实现...在上面的示例代码中,我们使用了scheduleAtFixedRate方法来执行定时任务。
在这个例子中,`TimeUnit.SECONDS.sleep(1)`等价于`Thread.sleep(1000)`,因为`TimeUnit.SECONDS.sleep(n)`会将秒数转换为毫秒数并调用`Thread.sleep()`。 除了`sleep()`方法,Java还提供了`Thread.yield()`方法,...
在Selenium中,我们可以使用ChromeOptions类来设置指定的浏览器。例如: `ChromeOptions option = new ChromeOptions();` `option.setBinary("D:\\360se6\\Application\\360se.exe");` `WebDriver driver = new ...
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 ...
这个包中的类主要用于解决多线程环境中数据的一致性和并发问题,它们通过内部机制确保了操作的原子性,从而避免了显式锁的使用,提高了效率。 #### Atomic类的分类 根据功能的不同,`java.util.concurrent.atomic`...
总结,Spring中使用`Timer`和`TimerTask`来实现精确时间运行的定时任务,虽然比直接使用`@Scheduled`注解稍微复杂一些,但能提供更细粒度的控制。在实际项目中,应根据需求选择合适的方式来实现定时任务。
线程在Java中由`java.lang.Thread`类表示,其生命周期包括以下几种状态: 1. **新建**(New):当使用`new Thread()`创建了一个线程对象时,线程处于新建状态。 2. **可运行**(Runnable):调用`start()`方法后,...
首先,我们可以利用`Runtime`类的`exec()`方法来执行操作系统级别的命令,例如在Windows系统中调用任务管理器的命令行接口`tasklist`来获取进程信息。以下是一个简单的示例: ```java import java.io....
"Java 中 Locks 的使用详解" 在 Java 中,Locks 是一种非常重要的同步机制,它提供了更加灵活的同步控制。在 Java 5 中,Locks 被引入,以提供更加灵活的同步控制。与 Synchronized Block 相比,Locks 提供了更加...