Exchanger是java多线程中用来交换数据的,只限于两个线程之间,测试代码:
package com.concurrent;
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import junit.framework.TestCase;
public class TestExchanger extends TestCase {
public void testExchanger1() {
new InnerTestExchanger(2).test();
}
public void testExchanger2() {
InnerTestExchanger t = new InnerTestExchanger(3);
for (int i = 0; i < 5; i++) {
t.test();
}
}
static class InnerTestExchanger extends Thread {
private int count = 2;
private static final int[] arr = new int[] { 10, 1, 3 };
public InnerTestExchanger(int count) {
this.count = count;
}
public void test() {
ExecutorService executorService = Executors.newFixedThreadPool(count);
final Exchanger<Integer> exchanger = new Exchanger<Integer>();
for (int i = 0; i < count; i++) {
final int index = i;
if (i == arr.length) {
break;
}
Runnable r = new Runnable() {
@Override
public void run() {
try {
int oldValue = arr[index];
int newValue = exchanger.exchange(oldValue);
System.out.println(Thread.currentThread() + ", oldValue = " + oldValue + ", newValue = " + newValue);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
executorService.submit(r);
}
executorService.shutdown();
}
}
}
运行testExchanger1,输出:
Thread[pool-1-thread-2,5,main], oldValue = 1, newValue = 10
Thread[pool-1-thread-1,5,main], oldValue = 10, newValue = 1
运行testExchanger2,输出:
Thread[pool-1-thread-3,5,main], oldValue = 3, newValue = 10
Thread[pool-1-thread-1,5,main], oldValue = 10, newValue = 3
Thread[pool-3-thread-3,5,main], oldValue = 3, newValue = 10
Thread[pool-3-thread-1,5,main], oldValue = 10, newValue = 3
Thread[pool-2-thread-3,5,main], oldValue = 3, newValue = 1
Thread[pool-2-thread-2,5,main], oldValue = 1, newValue = 3
Thread[pool-4-thread-2,5,main], oldValue = 1, newValue = 3
Thread[pool-4-thread-3,5,main], oldValue = 3, newValue = 1
Thread[pool-5-thread-1,5,main], oldValue = 10, newValue = 1
Thread[pool-5-thread-2,5,main], oldValue = 1, newValue = 10
看结果,说明,只能是两个线程交换数据,但是具体是哪两个线程,就没有要求了,谁先调用exchange方法,就是谁。