線程休眠是 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),轉載請原樣保留本信息。