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