java timeunit_java11教程--类TimeUnit用法

本文详细介绍了Java并发包中的TimeUnit类,包括其代表的不同时间单位及其转换方法。此外,还介绍了如何使用TimeUnit来执行定时操作,如Thread.sleep、Thread.join及Object.wait等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TimeUnit表示给定粒度单位的持续时间,并提供跨单元转换的实用方法,以及在这些单元中执行定时和延迟操作。

TimeUnit不保留时间信息,但仅帮助组织和使用可在各种上下文中单独维护的时间表示。

纳秒定义为千分之一微秒,微秒为千分之一毫秒,毫秒为千分之一秒,一分钟为六十秒,一小时为六十分钟,一天为二十四小时。

TimeUnit主要用于通知基于时间的方法如何解释给定的定时参数。 例如,如果lock不可用,则以下代码将在50毫秒内超时:

Lock lock = ...; if (lock.tryLock(50L, TimeUnit.MILLISECONDS)) ...

而此代码将在50秒内超时:

Lock lock = ...; if (lock.tryLock(50L, TimeUnit.SECONDS)) ...

但请注意,无法保证特定的超时实现能够以与给定的TimeUnit相同的粒度注意到时间的TimeUnit 。

时间单位代表二十四小时。

时间单位代表六十分钟。

时间单位代表千分之一毫秒。

时间单位代表千分之一秒。

时间单位代表六十秒。

时间单位代表千分之一微秒。

时间单位代表一秒。

将给定单位的给定持续时间转换为此单位。

将给定的持续时间转换为此单位。

ChronoUnit转换为等效值

TimeUnit 。

使用此时间单位执行

Thread.sleep 。

使用此时间单位执行定时

Thread.join 。

使用此时间单位执行定时

Object.wait 。

将此

TimeUnit转换为等效值

ChronoUnit 。

相当于

DAYS.convert(duration, this) 。

相当于

HOURS.convert(duration, this) 。

相当于

MICROSECONDS.convert(duration, this) 。

相当于

MILLISECONDS.convert(duration, this) 。

相当于

MINUTES.convert(duration, this) 。

相当于

NANOSECONDS.convert(duration, this) 。

相当于

SECONDS.convert(duration, this) 。

返回具有指定名称的此类型的枚举常量。

按照声明的顺序返回一个包含此枚举类型常量的数组。

时间单位代表千分之一微秒。

时间单位代表千分之一毫秒。

时间单位代表千分之一秒。

时间单位代表一秒。

时间单位代表六十秒。

时间单位代表六十分钟。

时间单位代表二十四小时。

按照声明的顺序返回一个包含此枚举类型常量的数组。

此方法可用于迭代常量,如下所示:

for (TimeUnit c : TimeUnit.values())

System.out.println(c);

返回具有指定名称的此类型的枚举常量。

该字符串必须与用于声明此类型中的枚举常量的标识符完全匹配。

(不允许使用无关的空白字符。)

将给定单位的给定持续时间转换为此单位。

从较细粒度到较粗粒度的转换会截断,因此会失去精度。

例如,将999毫秒转换为秒会导致0 。

从粗略到更细粒度的转换,如果为负,则数值溢出的参数饱和为Long.MIN_VALUE如果为正, Long.MAX_VALUE 。

例如,要将10分钟转换为毫秒,请使用: TimeUnit.MILLISECONDS.convert(10L, TimeUnit.MINUTES)

将给定的持续时间转换为此单位。

对于任何TIMEUNIT unit , unit.convert(Duration.ofNanos(n))相当于unit.convert(n, NANOSECONDS) ,和unit.convert(Duration.of(n, unit.toChronoUnit()))相当于n (在没有溢出的)。

使用此时间单位执行定时Object.wait 。

这是一种便捷方法,可将超时参数转换为Object.wait方法所需的Object.wait 。

例如,您可以使用poll方法实现阻止poll方法(请参阅BlockingQueue.poll ):

public E poll(long timeout, TimeUnit unit) throws InterruptedException { synchronized (lock) { while (isEmpty()) { unit.timedWait(lock, timeout); ... } } }

使用此时间单位执行定时Thread.join 。

这是一种便捷方法,可将时间参数转换为Thread.join方法所需的Thread.join 。

这是一种便捷方法,可将时间参数转换为Thread.sleep方法所需的Thread.sleep 。

将此

TimeUnit转换为等效值

ChronoUnit 。

ChronoUnit转换为等效的

TimeUnit 。

Enum Constants

Enum Constant

描述

时间单位代表二十四小时。

时间单位代表六十分钟。

时间单位代表千分之一毫秒。

时间单位代表千分之一秒。

时间单位代表六十秒。

时间单位代表千分之一微秒。

时间单位代表一秒。变量和类型

方法

描述

long

TimeUnit sourceUnit)

将给定单位的给定持续时间转换为此单位。

long

将给定的持续时间转换为此单位。

ChronoUnit chronoUnit)

ChronoUnit转换为等效值

TimeUnit 。

void

void

Thread thread, long timeout)

使用此时间单位执行定时

Thread.join 。

void

Object obj, long timeout)

使用此时间单位执行定时

Object.wait 。

将此

TimeUnit转换为等效值

ChronoUnit 。

返回具有指定名称的此类型的枚举常量。

static TimeUnit[]

按照声明的顺序返回一个包含此枚举类型常量的数组。

在Web应用中使用Java线程池,特别是`ScheduledThreadPoolExecutor`时,如果出现内存溢出线程数持续增加的问题,通常与线程池的配置、任务管理以及生命周期控制不当有关。以下是一些最佳实践建议: ### 线程池配置原则 1. **合理设置核心线程数最大线程数**:根据系统的处理能力预期负载来设定这些参数。一般而言,在双核处理器上,若阻塞系数为0.9,则可能需要开启20个线程以充分利用CPU资源[^2]。 2. **适当调整keepAliveTime**:默认情况下,只有当线程池中的线程数超过corePoolSize时,keepAliveTime才会起作用。通过调用allowCoreThreadTimeOut方法可以让核心线程也遵循这个超时机制,有助于减少不必要的资源占用[^3]。 3. **选择合适的任务队列**:任务队列的选择会影响线程池的行为。例如,使用无界队列(如LinkedBlockingQueue)可能导致新提交的任务被无限排队,而不会创建新的工作线程去处理它们,除非达到最大线程数限制[^4]。 ### 内存泄漏预防措施 - **避免长期持有外部对象引用**:确保在线程池执行的任务中不保留对外部对象或加载器的强引用,否则可能会导致这些对象无法被垃圾回收器回收,进而引发内存泄漏。 - **定期清理不再使用的定时任务**:对于`ScheduledThreadPoolExecutor`,应当注意及时取消那些已经完成或者不再需要的定时/周期性任务,并且要正确关闭线程池以释放所有相关资源。 ### 生命周期管理 - **优雅地关闭线程池**:使用shutdown()方法来停止接收新的任务,并等待已提交的任务执行完毕;必要时可使用awaitTermination()方法等待所有任务完成。若需立即终止所有正在执行的任务,可以考虑调用shutdownNow()方法[^4]。 - **监控线程池状态**:可以通过继承ThreadPoolExecutor并重写beforeExecute、afterExecute等方法来自定义监控逻辑,比如跟踪任务执行时间、统计异常信息等[^2]。 ### 示例代码 ```java // 创建一个固定大小的线程池 int corePoolSize = 10; int maximumPoolSize = 20; long keepAliveTime = 60L; TimeUnit unit = TimeUnit.SECONDS; ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, new LinkedBlockingQueue<Runnable>() ); // 提交任务 executor.execute(new MyTask()); // 关闭线程池 executor.shutdown(); // 或者 executor.shutdownNow(); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值