java 并发包工具 Exchanger

explain in detail

significant point (重要点)

Exchanger 用于两个线程之间互换数据。

  • 若其中一个线程发生错误的时候,会导致另外一个线程一直等待。
  • 操作的线程必须成对出现;符合一对一的规则。
  • 传递的参数,在两个线程中,使用的是同一个对象。
  • exchange方法可以在线程中多次使用。不断交换数据。

注意

Exchanger类仅可用作两个线程的信息交换,当超过两个线程调用同一个exchanger对象时,得到的结果是随机的,exchanger对象仅关心其包含的两个“格子”是否已被填充数据,当两个格子都填充数据完成时,该对象就认为线程之间已经配对成功,然后开始执行数据交换操作。

示例

import java.util.concurrent.Exchanger;

public class ExchangerExample1 {

    public static void main(String[] args) {
        final Exchanger<String> exchanger = new Exchanger<>();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"start");
                try {
                    String result =  exchanger.exchange("I am come from A");
                    System.out.println(Thread.currentThread().getName()+" get value =>" + result);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"end");
            }
        },"===A==").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"start");
                try {
                    String result =  exchanger.exchange("I am come from B");
                    System.out.println(Thread.currentThread().getName()+" get value =>" + result);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"end");
            }
        },"===B==").start();
    }
}
  /**
   * 结果
    * ===A==start
    * ===B==start
    * ===B== get value =>I am come from A
    * ===B==end
    * ===A== get value =>I am come from B
    * ===A==end
    * 
    * */

你可能感兴趣的:(并发编程)