`

Thread.sleep()和TimeUnit.SECONDS.sleep()的区别与联系

 
阅读更多
刚看到TimeUnit.SECONDS.sleep()方法时觉得挺奇怪的,这里怎么也提供sleep方法?
public void sleep(long timeout) throws InterruptedException {
    if (timeout > 0) {
        long ms = toMillis(timeout);
        int ns = excessNanos(timeout, ms);
        Thread.sleep(ms, ns);
    }
}
结果一看源码,原来是对Thread.sleep方法的包装,实现是一样的,只是多了时间单位转换和验证,然而TimeUnit枚举成员的方法却提供更好的可读性,这可能就是当初创建TimeUnit时提供sleep方法的原因吧,大家都知道sleep方法很常用,但经常要使用一个常量保存sleep的时间,比如3秒钟,我们代码通常会这样写:

private final int SLEEP_TIME = 3 * 1000; //3 seconds
因为Thread.sleep方法参数接受的毫秒单位的数值,比较下面代码就知道TimeUnit枚举成员的sleep方法更优雅:
TimeUnit.MILLISECONDS.sleep(10);
TimeUnit.SECONDS.sleep(10);
TimeUnit.MINUTES.sleep(10);
Thread.sleep(10);
Thread.sleep(10*1000);
Thread.sleep(10*60*1000);
但使用TimeUnit枚举成员的sleep方法会不会带来性能损失了,毕竟增加了函数调用开销?
测试测试吧:
import java.util.concurrent.TimeUnit;
public class TestSleep {
    public static void main(String[] args) throws InterruptedException {     
        sleepByTimeunit(10000);
                                                                                                                  
        sleepByThread(10000);    
    }
    private static void sleepByTimeunit(int sleepTimes) throws InterruptedException {
        long start = System.currentTimeMillis();
                                                                                                                  
        for(int i=0; i<sleepTimes; i++){
            TimeUnit.MILLISECONDS.sleep(10);
        }
                                                                                                                  
        long end = System.currentTimeMillis();
                                                                                                                  
        System.out.println("Total time consumed by TimeUnit.MILLISECONDS.sleep : " + (end - start));
    }
                                                                                                              
    private static void sleepByThread(int sleepTimes) throws InterruptedException {
        long start = System.currentTimeMillis();
                                                                                                                  
        for(int i=0; i<sleepTimes; i++){
            Thread.sleep(10);
        }
                                                                                                                  
        long end = System.currentTimeMillis();
                                                                                                                  
        System.out.println("Total time consumed by Thread.sleep : " + (end - start));
    }
}
两次测试结果(Win7+4G+JDK7 测试期间计算资源充足):
Total time consumed by TimeUnit.MILLISECONDS.sleep : 100068
Total time consumed by Thread.sleep : 100134
Difference : -- -66
Total time consumed by TimeUnit.MILLISECONDS.sleep : 100222
Total time consumed by Thread.sleep : 100077
Difference : -- +145
从结果可以看出10000次调用差异很小,甚至一次更快,不排除JVM进行了优化,如果忽略性能方面考虑,从可读性方面建议使用TimeUnit枚举成员的sleep方法。
另外TimeUnit是枚举实现一个很好的实例,Doug Lea太神了,佩服得五体投地!
出处:http://stevex.blog.51cto.com/4300375/1285767

参考:https://www.cnblogs.com/sanhuan/p/4826401.html
分享到:
评论

相关推荐

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

    TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("当前线程状态:" + Thread.currentThread().getState()); } }); thread.start(); // 主线...

    多线程之06三种中止线程的方法比较.docx

    TimeUnit.SECONDS.sleep(3); flag = false; // 表示终止上面的线程 System.out.println("程序运行结束"); } ``` ### 总结 在实际开发过程中,推荐使用`interrupt()`方法或`volatile`标志位来优雅地中止线程,这...

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

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

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

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

    java线程中断之interrupt和stop.docx

    TimeUnit.SECONDS.sleep(10); // 线程休眠后,该线程处于阻塞状态 } catch (InterruptedException e) { e.printStackTrace(); } } } } } public class ThreadDemo { public static void main(String[] args...

    Java多线程Semaphore工具的使用详解.rar

    TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在这个例子中,我们创建了一个最大并发线程数为5的Semaphore。当超过5个线程尝试执行`doSomeWork()`时,额外...

    Java多线程和JUC.pdf

    TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lockB) { System.out.println(Thread.currentThread().getName() + "lock:" + lockB + "=&gt;get" + ...

    java代码-测试延时的效果

    TimeUnit.SECONDS.sleep(1); // 延时1秒 ``` 3. **ScheduledExecutorService**:如果你需要更复杂的定时任务,比如定时执行、周期性执行,可以使用`java.util.concurrent.ScheduledExecutorService`。它提供了`...

    Java 中限制方法的返回时间最新方法.rar

    Thread.sleep(5000); return "Result"; } }); try { String result = future.get(2, TimeUnit.SECONDS); // 设置2秒超时 System.out.println(result); } catch (TimeoutException e) { future.cancel(true); ...

    一个轮询的java案例

    在Java中,实现轮询可以使用各种方式,包括while循环、Thread.sleep()方法来控制间隔时间,以及使用ScheduledExecutorService来更精确地调度任务。下面是一个简单的轮询示例: ```java import java.util.concurrent...

    自定义Flink SourceFunction定时读取数据库 包括实现思路说明和java代码

    TimeUnit.SECONDS.sleep(5); // 设置定时间隔,每5秒执行一次 } } catch (Exception e) { e.printStackTrace(); } finally { if (rs != null) { rs.close(); } if (pstmt != null) { pstmt.close(); } ...

    Java中停止线程执行的方法

    TimeUnit.SECONDS.sleep(1); // 每秒检查一次 } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 如果被中断,恢复中断状态 break; } // 游戏逻辑 } } ``` 此外,我们还可以使用...

    SpringBoot官方支持任务调度框架,轻量级用起来也挺香!.doc

    executor.scheduleAtFixedRate(task, 1, 1, TimeUnit.SECONDS); // 等待1秒后开始执行,之后每秒执行一次 Thread.sleep(2000); executor.shutdown(); } } 代码运行后,你会看到类似如下的输出: 13:11:45.268 ...

    页面控制定时任务源码

    在Java中,可以使用`Thread.sleep()`方法来模拟延时,或者使用`ScheduledExecutorService`来创建更复杂的定时任务。 ```java import java.util.concurrent.Executors; import java.util.concurrent....

    Android 获取当前网速质量调整网络请求

    Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); long endBytes = TrafficStats.getTotalRxBytes() + TrafficStats....

    建简单健壮的web自动化测试的模式

    - **消灭Thread.Sleep()和大部分WaitForCondition**:在测试脚本中使用固定等待时间(Thread.Sleep)是非常不推荐的做法,因为它会导致执行效率低下,当页面或某些元素加载较快时,测试会无谓地等待,浪费资源;...

    redisTemplate封装成redisUtils和分布式锁实现

    Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } return false; } public void unlock(String lockKey) { String currentValue = redisTemplate....

    android之子线程Thread

    executor.scheduleAtFixedRate(task, 0, 5, TimeUnit.SECONDS); // 每5秒执行一次 ``` 总结,Android子线程的应用主要在于避免阻塞主线程,提升用户体验。在处理图片这类耗时操作时,合理使用线程模型和定时机制...

    Java定时任务的三种实现方法

    executor.scheduleAtFixedRate(task, initialDelay, period, TimeUnit.SECONDS); } } ``` ScheduledExecutorService不仅提供了多线程支持,还可以根据需要调整延迟和执行间隔,使得定时任务的管理更加灵活和高效。...

Global site tag (gtag.js) - Google Analytics