Java并发编程之Exchanger方法详解
简介
Exchanger是一个用于线程间数据交换的工具类,它提供一个公共点,在这个公共点,两个线程可以交换彼此的数据。
当一个线程调用exchange方法后将进入等待状态,直到另外一个线程调用exchange方法,双方完成数据交换后继续执行。
Exchanger的使用
方法介绍
exchange(V x):阻塞当前线程,直到另外一个线程调用exchange方法或者当前线程被中断。
- x : 需要交换的对象。
exchange(V x, long timeout, TimeUnit unit):阻塞当前线程,直到另外一个线程调用exchange方法或者当前线程被中断或者等待超时。
- x: 需要交换的对象。
- timeout:超时时间。
- unit:超时时间单位。
exchange方法正常情况返回交换到的对象,当当前线程被中断或者等待超时时,exchange方法返回null。
示例1:A同学和B同学交换各自收藏的大片
public class Demo { public static void main(String[] args) { Exchanger<String> stringExchanger = new Exchanger<>(); Thread studentA = new Thread(() -> { try { String dataA = "A同学收藏多年的大片"; String dataB = stringExchanger.exchange(dataA); System.out.println("A同学得到了" + dataB); } catch (InterruptedException e) { e.printStackTrace(); } }); Thread studentB = new Thread(() -> { try { String dataB = "B同学收藏多年的大片"; String dataA = stringExchanger.exchange(dataB); System.out.println("B同学得到了" + dataA); } catch (InterruptedException e) { e.printStackTrace(); } }); studentA.start(); studentB.start(); } } /* * 输出结果: * B同学得到了A同学收藏多年的大片 * A同学得到了B同学收藏多年的大片 */
示例2:A同学被放鸽子,交易失败
public class Demo { public static void main(String[] args) { Exchanger<String> stringExchanger = new Exchanger<>(); Thread studentA = new Thread(() -> { String dataB = null; try { String dataA = "A同学收藏多年的大片"; //最多等待5秒 dataB = stringExchanger.exchange(dataA, 5, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } catch (TimeoutException ex){ System.out.println("等待超时-TimeoutException"); } System.out.println("A同学得到了" + dataB); }); studentA.start(); } } /* * 输出结果: * 等待超时-TimeoutException * A同学得到了null */
到此这篇关于Java并发编程之Exchanger方法详解的文章就介绍到这了,更多相关Java并发编程Exchanger内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
idea2020.1最新版永久破解/pycharm也可用(步骤详解)
这篇文章主要介绍了idea2020.1最新版永久破解/pycharm也可用,本文给大家分享简单实现步骤,通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-04-04Spring Boot整合ElasticSearch实现多版本兼容的方法详解
简单说,ElasticSearch(简称 ES)是搜索引擎,是结构化数据的分布式搜索引擎。下面这篇文章主要给大家介绍了关于Spring Boot整合ElasticSearch实现多版本兼容的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧2018-05-05Spring的请求映射handlerMapping以及原理详解
这篇文章主要介绍了Spring的请求映射handlerMapping以及原理详解,我们每次发请求,它到底是怎么找到我们哪个方法来去处理这个请求,因为我们知道所有的请求过来都会来到DispatcherServlet,springboot底层还是使用的是springMVC,需要的朋友可以参考下2023-08-08
最新评论