locksupport定義了一組公共靜態方法,這些方法提供了最基本的執行緒阻塞和喚醒功能。它是我們構建同步元件的基礎工具。
對locksupport工具類,我們介紹幾個基本的方法,如下:
方法名作用
void park()
阻塞當前執行緒,如果掉用unpark(thread)方法或被中斷,才能從park()返回
void parknanos(long nanos)
阻塞當前執行緒,超時返回,阻塞時間最長不超過nanos納秒
void parkuntil(long deadline)
阻塞當前執行緒,直到deadline時間點
void unpark(thread)
喚醒處於阻塞狀態的執行緒
上述我們接受locksupport工具時,其中就有乙個方法 void parknanos(long nanos) ,就是阻塞當前執行緒,超時返回,阻塞時間最長不超過nanos納秒,那麼我們使用的時候,怎麼才能簡單的傳入我們想要的納秒數呢?
這就需要我們的 timeutil 類了,其常用顆粒度如下
timeunit.days //天
timeunit.hours //小時
timeunit.minutes //分鐘
timeunit.seconds //秒
timeunit.milliseconds //毫秒
timeunit.microseconds //微秒
timeunit.nanoseconds //納秒
其 timeutil 類中含有的方法如下:
我們在其中就看見了有個 tonanos(long) 的方法,肯定和我們的 nanos 納秒數有關。
//把一毫秒轉換為多少納秒
system.out.
println
(timeunit.milliseconds.
tonanos(1
));//1000000
//把一微秒轉換為多少納秒
system.out.
println
(timeunit.microseconds.
tonanos(1
));//1000
//把一秒轉換為多少納秒
system.out.
println
(timeunit.seconds.
tonanos(1
));//1000000000
至於tomicros(long) 轉換為微秒、toseconds(long) 轉換為秒、tominutes(long) 轉換為分鐘、tohours(long) 轉換為小時、todays(long) 轉換為天數等方法和上述類似。
上述我們列舉的例子都是有大向小轉換,我們由小轉大也是支援的,如下
//把20小時轉換為天數
system.out.
println
(timeunit.hours.
todays(20
));//0
//把28小時轉換為天數
system.out.
println
(timeunit.hours.
todays(28
));//1
//把150秒轉換為分鐘
system.out.
println
(timeunit.seconds.
tominutes
(150))
;//2
//把150秒轉換為分鐘
system.out.
println
(timeunit.seconds.
tominutes(30
));//0
除了上述介紹的方法,都是可以看做把前面的時間單位轉換為後面的時間單位,要是你不習慣,我們也提供了從後往前轉換的方法,如下
//把60分鐘轉換為小時
system.out.
println
(timeunit.hours.
convert(60
, timeunit.minutes));
//1//把25小時轉換為天數
system.out.
println
(timeunit.days.
convert(25
, timeunit.hours));
//1
之前我們每次希望執行緒休眠等待一下,都是如下處理
//執行緒休眠一分鐘
thread.
currentthread()
.sleep
(60000);
//執行緒休眠三分鐘
thread.
currentthread()
.sleep
(180000
);
我們使用上述**時,不容易一眼看出執行緒需要休眠多久,所以我們一般建議分開寫,如下
//執行緒休眠一分鐘
thread.
currentthread()
.sleep(1
*60*1000);
//執行緒休眠三分鐘
thread.
currentthread()
.sleep(3
*60*1000
);
這樣是不是**可讀性好一些,其實我們的 timeutil 為我們提供了更加易讀的方法
//執行緒休眠一分鐘
timeunit.seconds.
sleep(1
);//執行緒休眠三分鐘
timeunit.seconds.
sleep(3
);
除了 sleep 方法,timeutil 還為我們提供了 timedjoin(thread thread, long timeout) 和 timedwait(object obj, long timeout),從方法後面結尾的join和wait,我們就可以看出 timedjoin(thread thread, long timeout) 就是讓乙個執行緒在 timeout 後執行,也就是對指定執行緒休眠指定時間顆粒度的時間, timedwait(object obj, long timeout) 就是對指定物件,休眠等待指定時間顆粒度的時間。
// 對當前執行緒休眠2秒
timeunit.seconds.
timedjoin
(thread.
currentthread()
,2);
// 對當前物件休眠2秒
timeunit.seconds.
timedwait
(this,2
);
注意使用 timedwait 需要加鎖。 LockSupport 工具相關整理
locksupport 中的park 和unpark 的作用分別是阻塞執行緒和解除阻塞執行緒,而且park 和unpark 不會遇到 thread.suspend 和 thread.resume 所可能引發的死鎖問題。返回提供給最近一次尚未解除阻塞的 park 方法呼叫的 blocker 物件,如果...
多執行緒同步工具 LockSupport
用例1 子執行緒等待主線程發放許可!public static void main string args thread.start system.out.println 主線程 休眠1秒!try catch interruptedexception e system.out.println 主線程...
執行緒阻塞工具類 LockSupport 讀書筆記
locksupport的靜態方法park 可以阻塞當前執行緒,類似的還有parknanos parkuntil 等,他們實現了乙個限時等待 public class locksupportdemo public void run public static void main string args...