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方法,就是谁。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java