|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object java.util.concurrent.Exchanger<V>
V
- 可以交換的物件型別public class Exchanger<V>
可以在對中對元素進行配對和交換的執行緒的同步點。每個執行緒將條目上的某個方法呈現給 exchange
方法,與夥伴執行緒進行比對,並且在返回時接收其夥伴的物件。Exchanger 可能被視為 SynchronousQueue
的雙向形式。Exchanger 可能在應用程序(比如遺傳演算法和管道設計)中很有用。
用法範例:以下是重點介紹的一個類別,該類別使用 Exchanger
在執行緒間交換緩衝區,因此,在需要時,填充緩衝區的執行緒獲取一個新騰空的緩衝區,並將填滿的緩衝區傳遞給騰空緩衝區的執行緒。
class FillAndEmpty {
Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>();
DataBuffer initialEmptyBuffer = ... a made-up type
DataBuffer initialFullBuffer = ...
class FillingLoop implements Runnable {
public void run() {
DataBuffer currentBuffer = initialEmptyBuffer;
try {
while (currentBuffer != null) {
addToBuffer(currentBuffer);
if (currentBuffer.isFull())
currentBuffer = exchanger.exchange(currentBuffer);
}
} catch (InterruptedException ex) { ... handle ... }
}
}
class EmptyingLoop implements Runnable {
public void run() {
DataBuffer currentBuffer = initialFullBuffer;
try {
while (currentBuffer != null) {
takeFromBuffer(currentBuffer);
if (currentBuffer.isEmpty())
currentBuffer = exchanger.exchange(currentBuffer);
}
} catch (InterruptedException ex) { ... handle ...}
}
}
void start() {
new Thread(new FillingLoop()).start();
new Thread(new EmptyingLoop()).start();
}
}
記憶體一致性效果:對於通過 Exchanger
成功交換物件的每對執行緒,每個執行緒中在 exchange()
之前的操作 happen-before 從另一執行緒中相應的 exchange()
返回的後續操作。
建構子摘要 | |
---|---|
Exchanger()
創建一個新的 Exchanger。 |
方法摘要 | |
---|---|
V |
exchange(V x)
等待另一個執行緒到達此交換點(除非當前執行緒被中斷),然後將給定的物件傳送給該執行緒,並接收該執行緒的物件。 |
V |
exchange(V x,
long timeout,
TimeUnit unit)
等待另一個執行緒到達此交換點(除非當前執行緒被中斷,或者超出了指定的等待時間),然後將給定的物件傳送給該執行緒,同時接收該執行緒的物件。 |
從類別 java.lang.Object 繼承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
建構子詳細資訊 |
---|
public Exchanger()
方法詳細資訊 |
---|
public V exchange(V x) throws InterruptedException
如果另一個執行緒已經在交換點等待,則出於執行緒排程目的,繼續執行此執行緒,並接收當前執行緒傳入的物件。當前執行緒立即返回,接收其他執行緒傳遞的交換物件。
如果還沒有其他執行緒在交換點等待,則出於排程目的,禁用當前執行緒,且在發生以下兩種情況之一前,該執行緒將一直處於休眠狀態:
中斷
當前執行緒。
如果當前執行緒:
InterruptedException
,並且清除當前執行緒的已中斷狀態。
x
- 要交換的物件
InterruptedException
- 如果當前執行緒在等待時被中斷public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
如果另一個執行緒已經在交換點上等待,則出於執行緒排程目的,繼續執行此執行緒,並接收當前執行緒傳入的物件。當前執行緒立即返回,並接收其他執行緒傳遞的交換物件。
如果還沒有其他執行緒在交換點等待,則出於排程目的,禁用當前執行緒,且在發生以下三種情況之一前,該執行緒將一直處於休眠狀態:
如果當前執行緒:
InterruptedException
,並且清除當前執行緒的已中斷狀態。
如果超出指定的等待時間,則拋出 TimeoutException
異常。如果該時間小於等於零,則此方法根本不會等待。
x
- 要交換的物件timeout
- 要等待的最長時間unit
- timeout 參數的時間單位
InterruptedException
- 如果當前執行緒在等待時被中斷
TimeoutException
- 如果在另一個執行緒進入交換點之前已經到達指定的等待時間
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。