package com.zqh.concurrent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Exchanger;
/**
* http://blog.csdn.net/u014783753/article/details/44805703
*/
public class TestExchanger {
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 producerThread = new Thread(producer);
Thread consumerThread = new Thread(consumer);
producerThread.start();
consumerThread.start();
}
}
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;
}
@Override
public void run() {
for(int i = 0; i < 10; i ++){
System.out.println("Producer cycle:" + (i+1));
for(int j = 0; j < 10; j ++){
String mess = "message:" + (i * 10) + j;
System.out.println("produce:" + mess);
buffer.add(mess);
}
try {
buffer = exchanger.exchange(buffer);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
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;
}
@Override
public void run() {
for(int i = 0; i < 10; i ++){
System.out.println("Consumer cycle:" + (i+1));
try {
buffer = exchanger.exchange(buffer);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int j = 0; j < 10; j ++){
String mess = buffer.get(0);
System.out.println("consume:" + mess);
buffer.remove(0);
}
}
}
}