|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object java.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。