第53回 シンクロナイザ編 Exchanger
今回のテーマは「Exchanger」です。
Exchangerはスレッドをペアにして、ペア内の要素を交換することができます。
次のサンプルコードはスレッド間でインスタンスを交換するプログラムです。(J2SE5.0以上対応)
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) throws Exception {
Exchanger<Appliances> exchanger = new Exchanger<Appliances>();
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.execute(new IRunnable(exchanger, "A", new PC()));
executorService.execute(new IRunnable(exchanger, "B", new TV()));
executorService.shutdown();
}
}
class IRunnable implements Runnable {
private static final String MESSAGE_FORMAT = "%1$sさんが%2$sを使用中";
private Exchanger<Appliances> exchanger;
private String name; private Appliances appliances;
public IRunnable(Exchanger<Appliances> exchanger,
String name, Appliances appliances) {
this.exchanger = exchanger;
this.name = name;
this.appliances = appliances;
}
public void run() {
System.out.println(String.format(MESSAGE_FORMAT, name,
appliances.getAppliancesName()));
try {
appliances = exchanger.exchange(appliances);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(String.format(MESSAGE_FORMAT, name,
appliances.getAppliancesName()));
}
}
interface Appliances {
public String getAppliancesName();
}
class PC implements Appliances {
public String getAppliancesName() {
return "PC";
}
}
class TV implements Appliances {
public String getAppliancesName() {
return "TV";
}
}
Appliancesインターフェースの実装クラスであるPCクラスとTVクラスのインスタンスを交換します。
2つのスレッドにはPCインスタンスかTVインスタンスのどちらか一方を渡していますが、exchangeメソッドによりインスタンスを交換することで、1つのスレッドで両方のインスタンスを使用しています。

