|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
| 上一個類別 下一個類別 | 框架 無框架 | |||||||||
| 摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 | |||||||||
java.lang.Objectjava.util.concurrent.locks.LockSupport
public class LockSupport
用來創建鎖和其他同步類別的基本執行緒阻塞原語。
此類別以及每個使用它的執行緒與一個許可關聯(從 Semaphore 類別的意義上說)。如果該許可可用,並且可在進程中使用,則調用 park 將立即返回;否則可能 阻塞。如果許可尚不可用,則可以調用 unpark 使其可用。(但與 Semaphore 不同的是,許可不能累積,並且最多只能有一個許可。)
park 和 unpark 方法提供了阻塞和解除阻塞執行緒的有效方法,並且不會遇到導致過時方法 Thread.suspend 和 Thread.resume 因為以下目的變得不可用的問題:由於許可的存在,調用 park 的執行緒和另一個試圖將其 unpark 的執行緒之間的競爭將保持活性。此外,如果調用者執行緒被中斷,並且支持逾時,則 park 將返回。park 方法還可以在其他任何時間“毫無理由”地返回,因此通常必須在重新檢查返回條件的循環裡調用此方法。從這個意義上說,park 是“忙碌等待”的一種優化,它不會浪費這麼多的時間進行自旋,但是必須將它與 unpark 配對使用才更高效。
三種形式的 park 還各自支持一個 blocker 物件參數。此物件在執行緒受阻塞時被記錄,以允許監視工具和診斷工具確定執行緒受阻塞的原因。(這樣的工具可以使用方法 getBlocker(java.lang.Thread) 存取 blocker。)建議最好使用這些形式,而不是不帶此參數的原始形式。在鎖實作中提供的作為 blocker 的普通參數是 this。
這些方法被設計用來作為創建高層級同步實用工具的工具,對於大多數共時控制應用程序而言,它們本身並不是很有用。park 方法僅設計用於以下形式的建構:
while (!canProceed()) { ... LockSupport.park(this); }
在這裡,在調用 park 之前,canProceed 和其他任何動作都不會鎖定或阻塞。因為每個執行緒只與一個許可關聯,park 的任何中間使用都可能干擾其預期效果。
範例用法。 以下是一個先進先出 (first-in-first-out) 非重入鎖類別的框架。
class FIFOMutex {
private final AtomicBoolean locked = new AtomicBoolean(false);
private final Queue<Thread> waiters
= new ConcurrentLinkedQueue<Thread>();
public void lock() {
boolean wasInterrupted = false;
Thread current = Thread.currentThread();
waiters.add(current);
// Block while not first in queue or cannot acquire lock
while (waiters.peek() != current ||
!locked.compareAndSet(false, true)) {
LockSupport.park(this);
if (Thread.interrupted()) // ignore interrupts while waiting
wasInterrupted = true;
}
waiters.remove();
if (wasInterrupted) // reassert interrupt status on exit
current.interrupt();
}
public void unlock() {
locked.set(false);
LockSupport.unpark(waiters.peek());
}
}
| 方法摘要 | |
|---|---|
static Object |
getBlocker(Thread t)
返回提供給最近一次尚未解除阻塞的 park 方法調用的 blocker 物件,如果該調用不受阻塞,則返回 null。 |
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)
如果給定執行緒的許可尚不可用,則使其可用。 |
| 從類別 java.lang.Object 繼承的方法 |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| 方法詳細資訊 |
|---|
public static void unpark(Thread thread)
park 上受阻塞,則它將解除其阻塞狀態。否則,保證下一次調用 park 不會受阻塞。如果給定執行緒尚未啟動,則無法保證此操作有任何效果。
thread - 要執行 unpark 操作的執行緒;該參數為 null 表示此操作沒有任何效果。public static void park(Object blocker)
如果許可可用,則使用該許可,並且該調用立即返回;否則,為執行緒排程禁用當前執行緒,並在發生以下三種情況之一前,使其處於休眠狀態:
此方法不 報告是哪個執行緒導致該方法返回。調用者應該重新檢查最先導致執行緒暫停的條件。調用者還可以確定返回時該執行緒的中斷狀態。
blocker - 導致此執行緒暫停的同步物件
public static void parkNanos(Object blocker,
long nanos)
如果許可可用,則使用該許可,並且該調用立即返回;否則,為執行緒排程禁用當前執行緒,並在發生以下四種情況之一前,使其處於休眠狀態:
此方法不 報告是哪個執行緒導致該方法返回。調用者應該重新檢查最先導致執行緒暫停的條件。調用者還可以確定返回時該執行緒的中斷狀態或已過的時間。
blocker - 導致此執行緒暫停的同步物件nanos - 要等待的最大毫秒數
public static void parkUntil(Object blocker,
long deadline)
如果許可可用,則使用該許可,並且該調用立即返回;否則,為執行緒排程禁用當前執行緒,並在發生以下四種情況之一前,使其處於休眠狀態:
此方法不 報告是哪個執行緒導致該方法返回。調用者應該重新檢查最先導致執行緒暫停的條件。調用者還可以確定返回時該執行緒的中斷狀態或當前時間。
blocker - 導致此執行緒暫停的同步物件deadline - 要等待的絕對時間,用相對於歷元 (Epoch) 的毫秒數值表示public static Object getBlocker(Thread t)
public static void park()
如果許可可用,則使用該許可,並且該調用立即返回;否則,為執行緒排程禁用當前執行緒,並在發生以下三種情況之一以前,使其處於休眠狀態:
此方法並不 報告是哪個執行緒導致該方法返回。調用者應該重新檢查最先導致執行緒暫停的條件。調用者還可以確定執行緒返回時的中斷狀態。
public static void parkNanos(long nanos)
如果許可可用,則使用該許可,並且該調用立即返回;否則,為執行緒排程禁用當前執行緒,並在發生以下四種情況之一以前,將其處於休眠狀態:
此方法並不 報告是哪個執行緒導致該方法返回。調用者應該重新檢查最先導致執行緒暫停的條件。調用者還可以確定執行緒返回時的中斷狀態或所用的時間。
nanos - 要等待的最大毫秒數public static void parkUntil(long deadline)
如果許可可用,則使用該許可,並且調用立即返回;否則,為執行緒排程禁用當前執行緒,並在發生以下四種情況之一以前,將其處於休眠狀態:
此方法並不 報告是哪個執行緒導致該方法返回。調用者應該重新檢查最先導致執行緒暫停的條件。調用者還可以確定執行緒返回時的中斷狀態或當前時間。
deadline - 要等待的絕對時間,用相對於歷元的毫秒數值表示
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
| 上一個類別 下一個類別 | 框架 無框架 | |||||||||
| 摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 | |||||||||
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。