Java并发编程——Exchanger的使用

        Exchanger从名字就可以看出来,交换呗~Exchanger一般用于两个工作线程之间交换数据,可以理解成用于成对出现的线程之间交换数据,创建一个Exchanger的时候传入一个泛型,这个泛型就是两条线程要交换的数据类型,Exchanger的方法很少很简洁,会在exchang()方法处阻塞,当两条县城同时执行到exchang()方法时,才会释放阻塞。


很简单,所以直接上栗子:

public static void main(String[] args) {
        final Exchanger exchanger = new Exchanger<>();
        //A线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("A线程开始执行耗时任务");
                    Thread.sleep(1000);
                    //线程会在该方法执行时阻塞,等待另一个线程调用此方法时,会释放阻塞,并且exchange()里的参数会互换
                    String stringA = exchanger.exchange("我是线程A的数据");
                    System.out.println("A线程输出:" + stringA);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        //B线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("B线程开始执行耗时任务");
                    Thread.sleep(3000);
                    //线程会在该方法执行时阻塞,等待另一个线程调用此方法时,会释放阻塞,并且exchange()里的参数会互换
                    String stringB = exchanger.exchange("我是线程B的数据");
                    System.out.println("B线程输出:" + stringB);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

        这里是用String类型做一个简单的测试,在实际项目中可以传任何我们所需要的泛型。
        然后看输出的log:

12-22 13:40:59.600 21178-21253/lbx.myapplication I/System.out: A线程开始执行耗时任务
12-22 13:40:59.600 21178-21254/lbx.myapplication I/System.out: B线程开始执行耗时任务
//3秒后的输出
12-22 13:41:02.600 21178-21254/lbx.myapplication I/System.out: B线程输出:我是线程A的数据
12-22 13:41:02.600 21178-21253/lbx.myapplication I/System.out: A线程输出:我是线程B的数据


         log上已经标出来了,3秒后才会释放阻塞,因为A线程1秒执行完任务后,在exchange()方发出阻塞住了,需要等到B线程也执行这个方法,才会互相释放阻塞。


你可能感兴趣的:(Java)