線程休眠只會用Thread.sleep?那你就弱爆了!


線程休眠是 Java 開發經常會用到的一個手段,就是讓當前線程睡一會兒,睡醒之后再繼續運行。

咱大多數程序員,多線程雖然學得不好,但線程休眠,無人不知,無人不曉,也都會用,不就是用 Thread.sleep 方法嘛!而且還將它用到那么絕,之前不是還有人寫過休眠排序算法和休眠取時間的算法,再來回味下這么腦洞大開的兩個算法:

笑過之后,當然,這不是咋今天要講的主題,棧長今天要講的是如何更優雅的讓線程休眠。

來看下面的休眠程序:

Thread.sleep(87000000);

你知道休眠多久嗎?

醉了……

再把上面的稍微改裝下:

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

現在你估計大概能知道休眠多久了,但還是很茫然,很無助,不寫注釋,誰知道休眠多久?單位還是毫秒。。

其實就是休眠 24 小時 10 分鍾,何必整這么麻煩呢?

優雅又簡單的方式來了:

TimeUnit.DAYS.sleep(1);
TimeUnit.MINUTES.sleep(10);

或者 

TimeUnit.HOURS.sleep(24);
TimeUnit.MINUTES.sleep(10);

使用 java.util.concurrent.TimeUnit 類就可以優雅的搞定,不需要過多的單位運算及修飾,是不是很優雅,很簡單?

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

來看下 TimeUnit 的詳細方法和枚舉值:

其實 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 休眠的原理:

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技術棧,棧長將繼續分享更多 Java 多線程系列干貨,在公眾號后台回復:多線程,可以獲取棧長已經整理好的歷史 Java 多線程系列干貨文章。

覺得有用,轉發分享下朋友圈給更多的人看吧,另外,給個好看,謝謝老板~

本文原創首發於微信公眾號:Java技術棧(id:javastack),轉載請原樣保留本信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM