Java多线程与并发库高级应用之线程数据交换Exchanger
JDK1.5提供了Exchanger用于两个线程的数据交换。两个线程先后到达交换点,先到达的线程会等待后到达的线程,然后两个线程互相交换数据,交换后双方持对方的数据。
Exchanger只提供了一个构造器:
Exchanger():创建一个新的Exchanger。
Exchanger中也只有两个方法:
V exchange(V x): 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
V exchange(V x, long timeout, TimeUnit unit): 等待另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。
见下面程序
- public class ExchangerDemo {
- public static void main(String[] args) {
- //线程池
- ExecutorService pool = Executors.newCachedThreadPool();
- //Exchanger
- final Exchanger<String> changer = new Exchanger<String>();
- //用于交互数据的线程1
- pool.execute(new Runnable() {
- @Override
- public void run() {
- try{
- String data1 = "苹果";
- System.out.println(Thread.currentThread().getName() +
- "-准备交换数据:" + data1);
- Thread.sleep((long)(Math.random()*10000));
- String data2 = (String)changer.exchange(data1);
- System.out.println(Thread.currentThread().getName() +
- "-已交换完数据,交换到的数据:" + data1);
- }catch(InterruptedException e){
- e.printStackTrace();
- }
- }
- });
- //用于交互数据的线程2
- pool.execute(new Runnable() {
- @Override
- public void run() {
- try{
- String data1 = "石榴";
- System.out.println(Thread.currentThread().getName() +
- "-准备交换数据:" + data1);
- Thread.sleep((long)(Math.random()*10000));
- String data2 = (String)changer.exchange(data1);
- System.out.println(Thread.currentThread().getName() +
- "-已交换完数据,交换到的数据:" + data1);
- }catch(InterruptedException e){
- e.printStackTrace();
- }
- }
- });
- pool.shutdown();
- }
- }
运行程序
看到两个线程将数据彼此交换。