美文网首页
20.多线程总结(六)-并发工具类-Exchanger的使用

20.多线程总结(六)-并发工具类-Exchanger的使用

作者: 任振铭 | 来源:发表于2020-04-18 12:09 被阅读0次

Exchanger提供一个同步点,在这个同步点,两个线程可以交换数据(exchange(V x)),所以有一点很明确,必须是两个线程成对出现,只要有一个线程落单它就会一直陷入等待之中而无法自拔,望夫处,江悠悠。化为石,不回头。机器的情感远超人类想象,除非你告诉它要等多久(exchange(V x, long timeout, TimeUnit unit)),这样它才知道什么时候应该放弃。当触发点exchange方法被执行,交换才会发生,等待才会结束。

下面看一个简单的代码示例:死神和张三的千年之恋
请自行忽略那些sleep吧,千年的等待,死神睡了千年,这些时间都是很无聊的

import java.util.concurrent.Exchanger;

public class TestExchanger {

    //死神
    static class GodOfDeath {
        public String name;
        public int age;

        GodOfDeath(String name, int age){
            this.name = name;
            this.age = age;
        }
    }
    public static void main(String[] args) throws InterruptedException {
        GodOfDeath w1 = new GodOfDeath("死神",1000);
        GodOfDeath w2 = new GodOfDeath("张三",23);
        Exchanger<GodOfDeath> exchanger = new Exchanger<>();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+" 我是"+w1.name+" "+w1.age+" 岁,我在等一个无助的年轻人和我交换身体,作为条件,我会帮他实现一个愿望");
                try {
                    GodOfDeath exchange = exchanger.exchange(w1);
                    System.out.println("开始了,年轻人,现在后悔也来不及了");
                    Thread.sleep(2000);
                    System.out.println(Thread.currentThread().getName()+" 哈哈 我的名字叫"+exchange.name+" 今年"+exchange.age+"岁了,我变年轻了");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"死神:").start();

        Thread.sleep(4000);
        System.out.println("我已等了千年");

        Thread.sleep(2000);
        System.out.println("千年。。。。");

        Thread.sleep(2000);
        System.out.println("我在等一个年轻人,他会来的,一定会的");

        Thread.sleep(2000);
        System.out.println("我看到他了");

        Thread.sleep(2000);

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+" 我叫"+w2.name+" 今年"+w2.age+" 岁,走头无路,我选择和死神做交易");
                try {
                    Thread.sleep(2000);
                    GodOfDeath exchange = exchanger.exchange(w2);
                    System.out.println("和我交换吧,死神");
                    Thread.sleep(2000);
                    System.out.println(Thread.currentThread().getName()+" 我绝不后悔。。。 我的名字叫"+exchange.name+" "+exchange.age+" 岁,我获得了死神的身体,有能力惩罚那些恶人了");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"张三").start();
    }
}
剧本开始上演
死神: 我是死神 1000 岁,我在等一个无助的年轻人和我交换身体,作为条件,我会帮他实现一个愿望
我已等了千年
千年。。。。
我在等一个年轻人,他会来的,一定会的
我看到他了
张三 我叫张三 今年23 岁,走头无路,我选择和死神做交易
和我交换吧,死神
开始了,年轻人,现在后悔也来不及了
张三 我绝不后悔。。。 我的名字叫死神 1000 岁,我获得了死神的身体,有能力惩罚那些恶人了
死神: 哈哈 我的名字叫张三 今年23岁了,我变年轻了

相关文章

  • 20.多线程总结(六)-并发工具类-Exchanger的使用

    Exchanger提供一个同步点,在这个同步点,两个线程可以交换数据(exchange(V x)),所以有一点很明...

  • 并发工具类 Exchanger

    简介 Exchanger(交换者),一个用于线程间协作的工具类。Exchanger用于线程间的数据交换,提供了一个...

  • 并发工具类-Exchanger

    1.使用示例 结果: 2.官方文档 线程可以交换元素的同步点。每个线程在exchange方法的入口准备好对象,与伙...

  • 主要并发工具类-Exchanger的使用

    Exchanger 从字面来看是一个交换器,它用来在线程间交换数据。到exchange方法处时会阻塞,传递给对方数...

  • Java并发工具类

    该篇文章介绍CountDownLatch,CycliBarrier,Semaphore,Exchanger并发工具...

  • JUC--并发工具类:Exchanger

    2018-10-02 原文推荐 死磕Java并发 在API是这么介绍的:可以在对中对元素进行配对和交换的线程的同步...

  • Java并发-28.并发工具类-Exchanger

    Exchanger用于进行线程间的数据交换。 提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。 第一个线...

  • ThreadLocal

    ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程...

  • ThreadLocal 用法

    ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程...

  • 多线程并发总结录(四)--并发工具类

    1 Fork/Join介绍 ​ ForkJoin是实现多线程"分而治之"思想的框架,将一个大任务分成多个一个个...

网友评论

      本文标题:20.多线程总结(六)-并发工具类-Exchanger的使用

      本文链接:https://www.haomeiwen.com/subject/oohvvhtx.html