一、并发阶段的数据交换
Exchanger辅助类:允许在并发任务之间交换数据
即:Exchanger类允许在两个线程之间定义同步点,当两个线程都到达同步点时,它们交换数据结构。
二、生产者-消费者问题
package com.weixuan.test;
import java.util.List;
import java.util.concurrent.Exchanger;
public class Producer implements Runnable {
private List<String> buffer;// 生产者-消费者进行交换的数据结构
private final Exchanger<List<String>> exchanger;// 用于同步生产者和消费者交换的数据结构
public Producer(List<String> buffer, Exchanger<List<String>> exchanger) {
this.buffer = buffer;
this.exchanger = exchanger;
}
// 循环执行10次数据交换
@Override
public void run() {
int cycle = 1;
for (int i = 0; i < 10; i++) {
System.out.println("Producer : Cycle " + cycle);
for (int j = 0; j < 10; j++) {
String message = "Event " + ((i * 10) + j);
System.out.println(message);
buffer.add(message);
}
try {
buffer=exchanger.exchange(buffer);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Producer: "+buffer.size());
cycle++;
}
}
}
package com.weixuan.test;
import java.util.List;
import java.util.concurrent.Exchanger;
public class Consumer implements Runnable {
private List<String> buffer;// 生产者-消费者进行交换的数据结构
private final Exchanger<List<String>> exchanger;// 用于同步生产者和消费者交换的数据结构
public Consumer(List<String> buffer, Exchanger<List<String>> exchanger) {
this.buffer = buffer;
this.exchanger = exchanger;
}
public void run() {
int cycle = 1;
for (int i = 0; i < 10; i++) {
System.out.println("Consumer : Cycle " + cycle);
try {
buffer = exchanger.exchange(buffer);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Consumer : " + buffer.size());
for (int j = 0; j < 10; j++) {
String message = buffer.get(0);
System.out.println("Consumer : " + message);
buffer.remove(0);
}
cycle++;
}
};
}
package com.weixuan.test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Exchanger;
public class Main {
public static void main(String[] args) {
List<String> buffer1 = new ArrayList<String>();
List<String> buffer2 = new ArrayList<String>();
Exchanger<List<String>> exchanger = new Exchanger<List<String>>();
Producer producer = new Producer(buffer1, exchanger);
Consumer consumer = new Consumer(buffer2, exchanger);
Thread threadProducer = new Thread(producer);
Thread threadConsumer = new Thread(consumer);
threadProducer.start();
threadConsumer.start();
}
}