第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つのスレッドで両方のインスタンスを使用しています。