示例程序:
生产者线程:
import java.util.ArrayList;
import java.util.List;
public class Producer implements Runnable {
private static List<Integer> buffer = new ArrayList<Integer>();
private boolean okToRun = true;
private final int BUFFSIZE = 10;
@Override
public void run() {
while (okToRun) {
if (buffer.isEmpty()) {
try {
for (int i = 0; i < BUFFSIZE; i++) {
buffer.add((int) (Math.random() * 100));
}
Thread.sleep((int) (Math.random() * 1000));
System.out.print("Producer Buffer: ");
for (int i : buffer) {
System.out.print(i + ",");
}
System.out.println();
System.out.println("Exchanging...");
buffer = ProductExchanger.exchanger.exchange(buffer);
} catch (InterruptedException e) {
okToRun = false;
}
}
}
}
}
消费者线程
import java.util.ArrayList;
import java.util.List;
public class Consumer implements Runnable {
private static List<Integer> buffer = new ArrayList<Integer>();
private boolean okToRun = true;
@Override
public void run() {
while (okToRun) {
try {
if (buffer.isEmpty()) {
buffer = ProductExchanger.exchanger.exchange(buffer);
System.out.print("Consumer Buffer: ");
for (int i : buffer) {
System.out.print(i + ",");
}
System.out.println('\n');
Thread.sleep((int) (Math.random() * 1000));
buffer.clear();
}
} catch (InterruptedException e) {
okToRun = false;
}
}
}
}
主程序:
import java.io.IOException;
import java.util.List;
import java.util.concurrent.Exchanger;
public class ProductExchanger {
public static Exchanger<List<Integer>> exchanger = new Exchanger<List<Integer>>();
public static void main(String[] args) {
Thread producer = new Thread(new Producer());
Thread consumer = new Thread(new Consumer());
producer.start();
consumer.start();
try {
while (System.in.read() != '\n') {
}
} catch (IOException e) {
e.printStackTrace();
}
producer.interrupt();
consumer.interrupt();
}
}
运行结果:
Producer Buffer: 76,93,38,7,79,81,94,73,46,96,
Exchanging...
Consumer Buffer: 76,93,38,7,79,81,94,73,46,96,
Producer Buffer: 90,22,4,74,74,17,4,95,90,29,
Exchanging...
Consumer Buffer: 90,22,4,74,74,17,4,95,90,29,
Producer Buffer: 92,74,66,54,31,15,6,77,92,87,
Exchanging...
Consumer Buffer: 92,74,66,54,31,15,6,77,92,87,
Producer Buffer: 75,68,48,10,96,25,87,68,14,91,
Exchanging...
Consumer Buffer: 75,68,48,10,96,25,87,68,14,91,
Producer Buffer: 74,97,31,24,87,5,64,89,22,14,
Exchanging...
Consumer Buffer: 74,97,31,24,87,5,64,89,22,14,