株式会社イーヴ

EeBlog(テクニカルブログ)

TOP > EeBlog > 第53回 シンクロナイザ編 Exchanger

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