|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
java.lang.Objectjava.util.concurrent.Exchanger<V>
V
- 교환되는 객체의 형태public class Exchanger<V>
thread를 페어로 해, 페어내의 요소를 교환할 수 있는 동기 포인트. 각 thread는,exchange
메소드에의 엔트리상의 객체를 제시해, 파트너 thread와 조합해, 돌아올 때에 그 파트너의 객체를 받습니다. Exchanger 는,SynchronousQueue
의 쌍방향 형식에서 표시되는 일도 있습니다. Exchanger 는, 유전 알고리즘이나 파이프라인 설계등의 어플리케이션으로 편리합니다.
사용례: 차에,Exchanger
를 사용해 thread간에 버퍼를 교환하는 클래스의 주요 부분을 나타냅니다. 버퍼를 채우는 thread가 필요에 따라서 새로운 빈 상태(empty)의 thread를 취득해, 버퍼를 비우는 thread에 채워진 버퍼를 건네줍니다.
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
를 개입시켜 객체를 정상적으로 교환하는 thread의 각 페어에서는, 각 thread내의 exchange()
의 전의 액션은, 이제(벌써) 한편의 thread내의 대응하는 exchange()
로부터의 복귀에 계속되는 액션의 「전에 발생」 합니다.
생성자 의 개요 | |
---|---|
Exchanger ()
새로운 Exchanger 를 작성합니다. |
메소드의 개요 | |
---|---|
V |
exchange (V x)
현재의 thread는,인터럽트가 발생하지 않는 한, 이제 한편의 thread가 이 교환 포인트에 이를 때까지 대기해, 지정된 객체를 그 thread에 전송 해, 대신에 이제(벌써) 한편의 thread의 객체를 받습니다. |
V |
exchange (V x,
long timeout,
TimeUnit unit)
현재의 thread는,인터럽트가 발생하는지, 지정된 대기 시간이 경과하지 않는 한, 이제 한편의 thread가 이 교환 포인트에 이를 때까지 대기해, 지정된 객체를 그 thread에 전송 해, 대신에 이제(벌써) 한편의 thread의 객체를 받습니다. |
클래스 java.lang. Object 로부터 상속된 메소드 |
---|
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait |
생성자 의 상세 |
---|
public Exchanger()
메소드의 상세 |
---|
public V exchange(V x) throws InterruptedException
이제(벌써) 한편의 thread가 벌써 교환 포인트로 대기하고 있는 경우, 그 thread는 thread의 스케줄링을 재개해, 현재의 thread가 건네주는 객체를 받습니다. 현재의 thread는 곧바로 복귀해, 이제(벌써) 한편의 thread가 교환 포인트에 건네주는 객체를 받습니다.
교환 포인트로 대기중의 다른 thread가 존재하지 않는 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 2 개중 한쪽이 일어날 때까지 대기합니다.
인터럽트
를 실시한다
현재의 thread로,
InterruptedException
가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.
x
- 교환하는 객체
InterruptedException
- 대기중에 현재의 thread로 인터럽트가 발생했을 경우public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException , TimeoutException
이제(벌써) 한편의 thread가 벌써 교환 포인트로 대기하고 있는 경우, 그 thread는 thread의 스케줄링을 재개해, 현재의 thread가 건네주는 객체를 받습니다. 현재의 thread는 곧바로 복귀해, 이제(벌써) 한편의 thread가 교환 포인트에 건네주는 객체를 받습니다.
교환 포인트로 대기중의 다른 thread가 존재하지 않는 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 3 개중 한쪽이 일어날 때까지 대기합니다.
인터럽트
를 실시한다
현재의 thread로,
InterruptedException
가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.
지정된 대기 시간이 경과하면(자),TimeoutException
가 throw 됩니다. 시간이 제로 또는 그것보다 작은 경우, 메소드는 대기하지 않습니다.
x
- 교환하는 객체timeout
- 대기하는 최장 시간unit
- timeout 인수의 시간 단위
InterruptedException
- 대기중에 현재의 thread로 인터럽트가 발생했을 경우
TimeoutException
- 이제(벌써) 한편의 thread가 교환 포인트에 들어가기 전에, 지정된 경과시간이 경과했을 경우
|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.