了解LockSupport工具及TimeUnit類

2021-09-27 07:06:00 字數 3691 閱讀 6906

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...