LockSupport 工具相關整理

2021-10-09 13:34:06 字數 1834 閱讀 4085

locksupport 中的park()unpark()的作用分別是阻塞執行緒和解除阻塞執行緒,而且park()unpark()不會遇到 " thread.suspend " 和 " thread.resume " 所可能引發的死鎖問題。

// 返回提供給最近一次尚未解除阻塞的 park 方法呼叫的 blocker 物件,如果該呼叫不受阻塞,則返回 null。

static object getblocker(thread t)

// 為了執行緒排程,禁用當前執行緒,除非許可可用。

static void park()

// 為了執行緒排程,在許可可用之前禁用當前執行緒。

static void park(object blocker)

// 為了執行緒排程禁用當前執行緒,最多等待指定的等待時間,除非許可可用。

static void parknanos(long nanos)

// 為了執行緒排程,在許可可用前禁用當前執行緒,並最多等待指定的等待時間。

static void parknanos(object blocker, long nanos)

// 為了執行緒排程,在指定的時限前禁用當前執行緒,除非許可可用。

static void parkuntil(long deadline)

// 為了執行緒排程,在指定的時限前禁用當前執行緒,除非許可可用。

static void parkuntil(object blocker, long deadline)

// 如果給定執行緒的許可尚不可用,則使其可用。

static void unpark(thread thread)

//阻塞執行緒

public native void park(boolean isabsolute, long time);

//取消阻塞執行緒

public native void unpark(object thread);

public static void park(object blocker)

setblocker 修改的是 parkblockeroffset 變數。

class<?> tk = thread.class;

parkblockeroffset = unsafe.objectfieldoffset(tk.getdeclaredfield("parkblocker"));

public static void parknanos(object blocker, long nanos) 

}

public static void parkuntil(object blocker, long deadline)

public static void unpark(thread thread)

實現機制不同。

locksupport 阻塞和解除阻塞執行緒直接操作的是 thread。而 object 的 wait/notify 並不是直接對執行緒操作,是被動的方法,需要乙個 object 來進行執行緒的掛起或喚醒。

thead 在呼叫 wait 之前,當前執行緒必須先獲得該物件的監視器(syschronized),被喚醒之後需要重新獲取到監視器才能繼續執行。而 locksupport 可以隨意進行 park 或者 unpark。

了解LockSupport工具及TimeUnit類

locksupport定義了一組公共靜態方法,這些方法提供了最基本的執行緒阻塞和喚醒功能。它是我們構建同步元件的基礎工具。對locksupport工具類,我們介紹幾個基本的方法,如下 方法名作用 void park 阻塞當前執行緒,如果掉用unpark thread 方法或被中斷,才能從park 返...

多執行緒同步工具 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...