JavaTM Platform
Standard Ed. 6

java.util.concurrent
클래스 Exchanger<V>

java.lang.Object 
  상위를 확장 java.util.concurrent.Exchanger<V>
형태 파라미터:
V - 교환되는 객체의 형태


public class Exchanger<V>
extends Object

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() 로부터의 복귀에 계속되는 액션의 「전에 발생」 합니다.

도입된 버젼:
1.5

생성자 의 개요
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
 

생성자 의 상세

Exchanger

public Exchanger()
새로운 Exchanger 를 작성합니다.

메소드의 상세

exchange

public V  exchange(V  x)
           throws InterruptedException 
현재의 thread는,인터럽트가 발생하지 않는 한, 이제 한편의 thread가 이 교환 포인트에 이를 때까지 대기해, 지정된 객체를 그 thread에 전송 해, 대신에 이제(벌써) 한편의 thread의 객체를 받습니다.

이제(벌써) 한편의 thread가 벌써 교환 포인트로 대기하고 있는 경우, 그 thread는 thread의 스케줄링을 재개해, 현재의 thread가 건네주는 객체를 받습니다. 현재의 thread는 곧바로 복귀해, 이제(벌써) 한편의 thread가 교환 포인트에 건네주는 객체를 받습니다.

교환 포인트로 대기중의 다른 thread가 존재하지 않는 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 2 개중 한쪽이 일어날 때까지 대기합니다.

현재의 thread로,

InterruptedException 가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.

파라미터:
x - 교환하는 객체
반환값:
이제(벌써) 한편의 thread에 의해 제공되는 객체
예외:
InterruptedException - 대기중에 현재의 thread로 인터럽트가 발생했을 경우

exchange

public V  exchange(V  x,
                  long timeout,
                  TimeUnit  unit)
           throws InterruptedException ,
                  TimeoutException 
현재의 thread는,인터럽트가 발생하는지, 지정된 대기 시간이 경과하지 않는 한, 이제 한편의 thread가 이 교환 포인트에 이를 때까지 대기해, 지정된 객체를 그 thread에 전송 해, 대신에 이제(벌써) 한편의 thread의 객체를 받습니다.

이제(벌써) 한편의 thread가 벌써 교환 포인트로 대기하고 있는 경우, 그 thread는 thread의 스케줄링을 재개해, 현재의 thread가 건네주는 객체를 받습니다. 현재의 thread는 곧바로 복귀해, 이제(벌써) 한편의 thread가 교환 포인트에 건네주는 객체를 받습니다.

교환 포인트로 대기중의 다른 thread가 존재하지 않는 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 3 개중 한쪽이 일어날 때까지 대기합니다.

현재의 thread로,

InterruptedException 가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.

지정된 대기 시간이 경과하면(자),TimeoutException 가 throw 됩니다. 시간이 제로 또는 그것보다 작은 경우, 메소드는 대기하지 않습니다.

파라미터:
x - 교환하는 객체
timeout - 대기하는 최장 시간
unit - timeout 인수의 시간 단위
반환값:
이제(벌써) 한편의 thread에 의해 제공되는 객체
예외:
InterruptedException - 대기중에 현재의 thread로 인터럽트가 발생했을 경우
TimeoutException - 이제(벌써) 한편의 thread가 교환 포인트에 들어가기 전에, 지정된 경과시간이 경과했을 경우

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.