株式会社イーブ|未経験・転職の方も就職可能。Javaプログラマー育成のエキスパート

HOMEJAVA技術者育成システム開発求人情報個人情報保護

第 52 回 ~ シンクロナイザ編 Exchanger ~

トップページ > Java技術者育成 > Javaワンポイント > 第 52 回 ~ シンクロナイザ編 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つのスレッドで両方のインスタンスを使用しています。


[Javaワンポイント]内の前後の記事
第 53 回 ~ ロック編 synchronizedによるロック ~
→ 第 52 回 ~ シンクロナイザ編 Exchanger ~
第 51 回 ~ シンクロナイザ編 Semaphore ~


■更新日時での前後の記事
5月21日 お天気
→ 第 52 回 ~ シンクロナイザ編 Exchanger ~
受付より vol.49