今回のテーマは「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つのスレッドで両方のインスタンスを使用しています。
■[Javaワンポイント]内の前後の記事
↑ 第 53 回 ~ ロック編 synchronizedによるロック ~
→ 第 52 回 ~ シンクロナイザ編 Exchanger ~
↓ 第 51 回 ~ シンクロナイザ編 Semaphore ~
■更新日時での前後の記事
↑ 5月21日 お天気
→ 第 52 回 ~ シンクロナイザ編 Exchanger ~
↓ 受付より vol.49
