TimeUnit

转http://blog.youkuaiyun.com/hudashi/article/details/6936604

public enum TimeUnit
extends Enum<TimeUnit>
TimeUnit 表示给定单元粒度的时间段,它提供在这些单元中进行跨单元转换和执行计时及延迟操作的实用工具方法。TimeUnit 不维护时间信息,但是有助于组织和使用可能跨各种上下文单独维护的时间表示形式。
TimeUnit 主要用于通知基于时间的方法如何解释给定的计时参数。

例如,如果 lock 不可用,则以下代码将在 50 毫秒后超时:
  Lock lock = ...;
  if ( lock.tryLock(50L, TimeUnit.MILLISECONDS) ) ...
 而以下代码将在 50 秒后超时:
  Lock lock = ...;
  if ( lock.tryLock(50L, TimeUnit.SECONDS) ) ...
但是注意,不保证特定超时实现能够以与给定 TimeUnit 相同的粒度通知 段。 
从以下版本开始:
    1.5 
枚举常量摘要
MICROSECONDS    微秒   一百万分之一秒(就是毫秒/1000)
MILLISECONDS    毫秒   千分之一秒    
NANOSECONDS   毫微秒  十亿分之一秒(就是微秒/1000)
SECONDS          秒
MINUTES     分钟
HOURS      小时
DAYS      天
主要接口:
 long  convert(long duration, TimeUnit unit)
          将给定单元的时间段转换到此单元。
 void  sleep(long timeout)
          使用此单元执行 Thread.sleep.这是将时间参数转换为 Thread.sleep 方法所需格式的便捷方法。
 void  timedJoin(Thread thread, long timeout)
          使用此时间单元执行计时的 Thread.join。
 void  timedWait(Object obj, long timeout)
          使用此时间单元执行计时的 Object.wait。
 long  toMicros(long duration)
          等效于 MICROSECONDS.convert(duration, this)。
 long  toMillis(long duration)
          等效于 MILLISECONDS.convert(duration, this)。
 long  toNanos(long duration)
          等效于 NANOSECONDS.convert(duration, this)。
 long  toSeconds(long duration)
          等效于 SECONDS.convert(duration, this)。
static TimeUnit  valueOf(String name)
          返回带有指定名称的该类型的枚举常量。
static TimeUnit[]  values()
          按照声明该枚举类型的常量的顺序,返回包含这些常量的数组。
注意1:它的常量MICROSECONDS,MILLISECONDS,NANOSECONDS,SECONDS都是TimeUnit类型
注意2:convert(long duration, TimeUnit unit)的意思将duration这个时间转化为本对象(this)所表示的时间形式。
本对象可能MICROSECONDS,MILLISECONDS,NANOSECONDS,SECONDS的一种。
至于duration是哪种形式的时间(MICROSECONDS,MILLISECONDS,NANOSECONDS,SECONDS的一种),
则是通过参数TimeUnit unit来确定的
注意3:TimeUnit是enum(枚举)类型,不能通过外部来实例化。
对用户来说只有它内部定义的下常量可用:MICROSECONDS,MILLISECONDS,NANOSECONDS,SECONDS,MINUTES,HOURS,DAYS
注意4:对于常量MINUTES,HOURS,DAYS,在Java1.5和Android中并没看到,但是在Java1.6中却有。
注意5:关于枚举类型的知识可参加《 枚举类型
实例1:
class Task implements Delayed
{
 String name;
 long submitTime;
 Task(String taskName,long delayTime)
 {
  name=taskName;
  /*conver the time from MILLISECONDS to NANOSECONDS
   * *
   */
  submitTime=TimeUnit.NANOSECONDS.convert(submitTime, TimeUnit.MILLISECONDS) + System.nanoTime();  
 }
 public long getDelay(TimeUnit unit) 
 {  
  System.out.println("get delay");
         return unit.convert(submitTime - System.nanoTime(), TimeUnit.NANOSECONDS);  
  }  
    public int compareTo(Delayed o) 
    {  
     System.out.println("compareTo");
         Task that = (Task) o;  
         return submitTime > that.submitTime?1:(submitTime < that.submitTime ? -1 : 0);  
    } 
 void doTask()
 {
  System.out.println("do task:"+name);
 }
}

转载于:https://www.cnblogs.com/yaya-Android/p/4543927.html

<think>好的,用户现在问的是“TimeUnit 毫秒”,需要给出关于如何在Java中使用TimeUnit来处理毫秒的详细回答。首先,我得回顾一下之前的对话历史,看看有没有相关的信息已经被提到过。之前用户问过关于Java线程睡眠的方式,包括TimeUnit.SECONDS.sleep(1)的使用,所以这次可能需要更具体地聚焦在毫秒级别的操作上。 用户可能想知道如何用TimeUnit来实现毫秒级的休眠,以及相关的注意事项。需要解释TimeUnit.MILLISECONDS.sleep()的用法,并对比Thread.sleep()的差异。同时,可能还需要提到异常处理、中断响应,以及实际应用场景。 接下来,我需要确保回答的结构清晰,包括示例代码、关键特性、常见错误和相关问题。要注意用户可能的疑问点,比如为什么使用TimeUnit而不是直接用Thread.sleep,或者如何处理中断异常。 另外,用户可能希望了解TimeUnit在毫秒级别下的精度和实际应用中的注意事项,比如系统时钟的影响。还要检查是否有遗漏的重要信息,比如TimeUnit的其他方法或者与线程池结合使用的例子。 最后,确保生成的相关问题覆盖TimeUnit的底层实现、异常处理、替代方案、精确性和性能优化等方面,帮助用户深入理解。</think>`TimeUnit.MILLISECONDS.sleep()` 是 Java 中基于 `TimeUnit` 枚举实现的毫秒级线程休眠方法,其本质是对 `Thread.sleep()` 的封装,但通过时间单位枚举提升了代码可读性。以下是详细说明: --- ### **1. 基本用法** ```java try { // 线程休眠 500 毫秒 TimeUnit.MILLISECONDS.sleep(500); } catch (InterruptedException e) { // 处理中断异常(建议恢复中断状态) Thread.currentThread().interrupt(); } ``` --- ### **2. 与 `Thread.sleep()` 的关系** - **底层实现**:`TimeUnit.MILLISECONDS.sleep(500)` 最终调用的是 `Thread.sleep(500)`。 - **优势**: - **避免硬编码**:直接使用 `MILLISECONDS` 枚举值,无需手动转换(如 `500毫秒 = 0.5秒`)。 - **可读性更高**:明确表达时间单位,减少 `Thread.sleep(500)` 中隐含的毫秒假设。 - **灵活性**:通过枚举切换时间单位(如 `SECONDS`、`MINUTES`)时无需修改数值。 --- ### **3. 关键特性** | 特性 | 说明 | |---------------------|----------------------------------------------------------------------| | **不释放锁** | 休眠期间线程不会释放已持有的锁资源(与 `Object.wait()` 不同)。 | | **中断响应** | 若线程被中断(如调用 `interrupt()`),会抛出 `InterruptedException`。 | | **系统依赖** | 实际精度受操作系统调度器影响(Windows 通常为 15ms,Linux 为 1ms)。 | --- ### **4. 典型应用场景** 1. **高精度延迟控制** 在需要精确到毫秒的场景(如游戏循环、传感器数据采集)中使用: ```java while (true) { readSensorData(); TimeUnit.MILLISECONDS.sleep(10); // 每10毫秒采集一次数据 } ``` 2. **限流与重试策略** 在网络请求失败后实现毫秒级退避重试: ```java for (int i = 0; i < MAX_RETRIES; i++) { if (sendRequest()) break; TimeUnit.MILLISECONDS.sleep((long) Math.pow(2, i) * 100); // 指数退避 } ``` 3. **定时任务调度** 配合 `ScheduledExecutorService` 实现周期性执行: ```java ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); executor.scheduleAtFixedRate(() -> { System.out.println("每200毫秒执行一次"); }, 0, 200, TimeUnit.MILLISECONDS); ``` --- ### **5. 常见错误与修复** - **错误1:忽略中断异常处理** ```java // 错误写法:直接吞掉异常 catch (InterruptedException e) { // 忽略异常 } ``` **修复**:恢复中断状态或向上抛出异常: ```java catch (InterruptedException e) { Thread.currentThread().interrupt(); // 恢复中断状态 throw new RuntimeException("休眠被中断", e); } ``` - **错误2:过度依赖毫秒精度** **问题**:在 Windows 系统中,`Thread.sleep(1)` 可能实际休眠 15ms。 **解决方案**:使用 `LockSupport.parkNanos(1_000_000)` 实现纳秒级控制(需谨慎使用)。 --- ### **6. 性能考量** - **短时休眠的开销**:频繁调用 `sleep(1)` 可能导致线程频繁挂起和唤醒,影响性能。 - **替代方案**:对于超短时休眠(如等待硬件响应),可考虑自旋锁或 `Busy Wait`(需结合 `Thread.onSpinWait()` 优化)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值