コンセプト
交換機は、タスク駆動される2つのスレッド間でオブジェクトを交換することができます。切り替える前に、タスクが成立BタスクがD2オブジェクト保持し、D1オブジェクト。交換後、タスクがD2オブジェクト、BタスクがD1のオブジェクトを保持する保持します。
交換機は、シナリオを使用することができます。
1.大量のデータ、マルチステップタスクを行います
例えば、全体のタスクが分割n個のセグメントになりました。実行時にある程度のスクリプトを処理する最初のタスク、交換交換()操作を実行すると、データは、全体的な作業をスピードアップするために、各タスクが別のスレッドによって駆動され、第2の被処理ピースタスクに送信されていますスピード。
2.遺伝的アルゴリズム
II。使用
1.交換器()
コンストラクタは、新しい交換はオブジェクトを作成します
/**
* Creates a new Exchanger.
*/
public Exchanger() {
participant = new Participant();
}
2.交換(V x)から
交換可能なオブジェクト。2つのタスクが成功する()スワップ交換を呼び出す必要があります。タスクが交換交換オブジェクト()を呼び出すと、それは別のタスクも同じ交換器()メソッドの交換オブジェクトと呼ばれるまでブロックすることになり、その後、Xオブジェクト操作が成功するスワップ。
III。ケース
この例では、オブジェクト間の交換と生産者と消費者、脂肪がオブジェクトプロデューサーの生産、消費者支出脂肪オブジェクト、スワップ一覧<脂肪>コレクションを作成します。
1.プロデューサー
private Generator<T> generator;
private Exchanger<List<T>> exchanger;
private List<T> holder;
public ExchangerProducer(Exchanger<List<T>> exchanger, Generator<T> gen, List<T> holder) {
this.exchanger = exchanger;
this.generator = gen;
this.holder = holder;
}
@Override
public void run() {
try {
while(!Thread.interrupted()) {
for(int i = 0; i < ExchangerDemo.size; i++) {
holder.add(generator.next());
}
holder = exchanger.exchange(holder);
}
} catch (InterruptedException e) {
System.out.println("OK to terminate this way");
}
}
}
2.消費者
class ExchangerConsumer<T> implements Runnable {
private Exchanger<List<T>> exchanger;
private List<T> holder;
private volatile T value;
public ExchangerConsumer(Exchanger<List<T>> exchanger, List<T> holder) {
this.exchanger = exchanger;
this.holder = holder;
}
@Override
public void run() {
try {
while(!Thread.interrupted()) {
holder = exchanger.exchange(holder);
for (T x : holder) {
// 此处在遍历列表时,移除了元素。为了不报错ConcurrentModificationException,
// 所以使用CopyOnWriteArrayList
value = x;
holder.remove(x);
}
}
}catch (InterruptedException e) {
System.out.println("OK to terminate this way");
}
System.out.println("Final value: " + value);
}
}
3.主な方法
public class ExchangerDemo {
static int size = 10;
static int delay = 5;
public static void main(String[] args) throws Exception{
if(args.length > 0) {
size = Integer.parseInt(args[0]);
}
if(args.length > 1) {
delay = Integer.parseInt(args[1]);
}
ExecutorService exec = Executors.newCachedThreadPool();
Exchanger<List<Fat>> xc = new Exchanger<>();
List<Fat> producerList = new CopyOnWriteArrayList<>();
List<Fat> consumerList = new CopyOnWriteArrayList<>();
exec.execute(new ExchangerProducer<>(xc, BasicGenerator.create(Fat.class), producerList));
exec.execute(new ExchangerConsumer<>(xc, consumerList));
TimeUnit.SECONDS.sleep(delay);
exec.shutdownNow();
}
}
4.結果を実行します
OK to terminate this way
Final value: Fat id:90189
OK to terminate this way