线程休眠只会用 Thread.sleep?来,教你新姿势!

简介: 线程休眠是 Java 开发经常会用到的一个手段,就是让当前线程睡一会儿,睡醒之后再继续运行。

image.png线程休眠是 Java 开发经常会用到的一个手段,就是让当前线程睡一会儿,睡醒之后再继续运行。


咱大多数程序员,多线程虽然学得不好,但线程休眠,无人不知,无人不晓,也都会用,不就是用 Thread.sleep 方法嘛!而且还将它用到那么绝,之前不是还有人写过休眠排序算法和休眠取时间的算法,再来回味下这么脑洞大开的两个算法:


休眠排序算法


休眠取时间算法


笑过之后,当然,这不是咋今天要讲的主题,栈长今天要讲的是如何更优雅的让线程休眠。

来看下面的休眠程序:

Thread.sleep(87000000);

你知道休眠多久吗?

醉了……

再把上面的稍微改装下:

Thread.sleep(24 * 60 * 60 * 1000 + 10 * 60 * 1000);

现在你估计大概能知道休眠多久了,但还是很茫然,很无助,不写注释,谁知道休眠多久?单位还是毫秒。。

其实就是休眠 24 小时 10 分钟,何必整这么麻烦呢?优雅又简单的方式来了:

1. TimeUnit.DAYS.sleep(1);
2. TimeUnit.MINUTES.sleep(10);
3. 
4. 或者 
5. 
6. TimeUnit.HOURS.sleep(24);
7. TimeUnit.MINUTES.sleep(10);

使用 java.util.concurrent.TimeUnit 类就可以优雅的搞定,不需要过多的单位运算及修饰,是不是很优雅,很简单?

上面演示了 HOURS、MINUTES,还有更多的枚举可以用。

来看下 TimeUnit 的详细方法和枚举值:

image.png其实 TimeUnit 还可以用来做时间单位转换,TimeUnit 提供了各种丰富的时间单位转换方法。

我们随便来看一个枚举值:

MINUTES {
    public long toNanos(long d)   { return x(d, C4/C0, MAX/(C4/C0)); }
    public long toMicros(long d)  { return x(d, C4/C1, MAX/(C4/C1)); }
    public long toMillis(long d)  { return x(d, C4/C2, MAX/(C4/C2)); }
    public long toSeconds(long d) { return x(d, C4/C3, MAX/(C4/C3)); }
    public long toMinutes(long d) { return d; }
    public long toHours(long d)   { return d/(C5/C4); }
    public long toDays(long d)    { return d/(C6/C4); }
    public long convert(long d, TimeUnit u) { return u.toMinutes(d); }
    int excessNanos(long d, long m) { return 0; }
}

可以很方便的把分钟转换成各种单位的值。

再来看一下 TimeUnit 休眠的原理:

1.
public void sleep(long timeout) throws InterruptedException {
    if (timeout > 0) {
        long ms = toMillis(timeout);
        int ns = excessNanos(timeout, ms);
        Thread.sleep(ms, ns);
    }
}

其实 TimeUnit 的休眠就是调用了 Thread.sleep 休眠方法,哈哈,只是把 Thread.sleep 封装了,这样,用起来很简单方便,也提高了可读性。

相关文章
|
Java 调度
【JavaSE专栏81】线程休眠,一种暂停线程执行的方法
【JavaSE专栏81】线程休眠,一种暂停线程执行的方法
191 0
|
并行计算 安全 Java
深入理解Java并发编程:并行与并发、进程与线程、优先级、休眠与让步
深入理解Java并发编程:并行与并发、进程与线程、优先级、休眠与让步
327 0
|
7月前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
496 0
|
7月前
|
Java 调度
多线程与并发编程【线程休眠、线程让步、线程联合、判断线程是否存活】(二)-全面详解(学习总结---从入门到深化)
多线程与并发编程【线程休眠、线程让步、线程联合、判断线程是否存活】(二)-全面详解(学习总结---从入门到深化)
58 1
|
Java
【Java】Java中让线程休眠一段时间再进行如何操作?
【Java】Java中让线程休眠一段时间再进行如何操作?
129 0
|
Java
Java设置和获取线程名称及线程休眠
当想在Runnable实现类的run方法中及Callable实现类的call方法中获取当前线程的名字,就得通过Thread.currentThread()获取当前线程
251 0
Java设置和获取线程名称及线程休眠
|
Java 开发者
线程的休眠 | 学习笔记
快速学习线程的休眠
104 0
线程的休眠 | 学习笔记
|
Java
Java线程方法-休眠(sleep)
Java线程方法-休眠(sleep)
510 0
Java线程方法-休眠(sleep)
|
调度
多线程(Thread类、线程创建、中断、等待、休眠)
多线程(Thread类、线程创建、中断、等待、休眠)
179 0