博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发核心-exchanger
阅读量:7183 次
发布时间:2019-06-29

本文共 1980 字,大约阅读时间需要 6 分钟。

hot3.png

Exchanger类的作用

Exchanger的功能可以使两个线程(重点: 只有两个线程)之间传输数据

  • 重点是exchange()方法

  • exchange()方法是阻塞执行的,可以设置超时时间 可调用不同的Api

    package com.f.fmodules.fuser.example.exchanger;	import java.util.concurrent.Exchanger;	public class ExchangerThread extends Thread{		private Exchanger
    exchanger; private String threadName; private String changeString; ExchangerThread(String threadName, String changeString, Exchanger
    exchanger) { super(); this.threadName = threadName; this.changeString = changeString; this.exchanger = exchanger; } @Override public void run() { try { System.out.println("Thread[" + threadName + "]交换到消息:" + exchanger.exchange(changeString)); } catch (Exception e) { e.printStackTrace(); } } }
    package com.f.fmodules.fuser.example.exchanger;	import java.util.concurrent.Exchanger;	public class ExchangerTest {		public static void main(String[] args) {			Exchanger
    exchanger = new Exchanger<>(); ExchangerThread t1 = new ExchangerThread("1","changString1", exchanger); ExchangerThread t2 = new ExchangerThread("2","changString2", exchanger); t1.start(); t2.start(); } }
  • 运行结果

  • 例: 三个线程操作

    package com.f.fmodules.fuser.example.exchanger;	import java.util.concurrent.Exchanger;	public class ExchangerTest {		public static void main(String[] args) {			Exchanger
    exchanger = new Exchanger<>(); ExchangerThread t1 = new ExchangerThread("1","changString1", exchanger); ExchangerThread t2 = new ExchangerThread("2","changString2", exchanger); ExchangerThread t3 = new ExchangerThread("3","changString3", exchanger); t1.start(); t2.start(); t3.start(); } }
  • 此时程序的运行结果是不确定的,多次运行可以发现,配对结果可能是Thread[2]和Thread[3]交换,也可能是Thread[1]和Thread[2]交换,而剩下的未得到配对的线程,则会被阻塞,永久等待,直到与之配对的线程到达位置,对于本程序,则只能强制将其停止

  • 阻塞状态

  • 可设置五秒超时时间

    System.out.println("Thread[" + threadName + "]交换到消息:" + exchanger.exchange(changeString, 5, TimeUnit.SECONDS));
  • 运行结果

转载于:https://my.oschina.net/u/3498817/blog/3037440

你可能感兴趣的文章
【译】函数式的React
查看>>
Redis 和 Memcached 的区别大吗?只选一个做缓存我们该选哪个?
查看>>
跟父亲一样伟大的程序员,请一定要照顾好自己!
查看>>
java B2B2C Springboot电子商城系统-高可用的服务注册中心
查看>>
CSS技巧:Flex弹性布局大型攻略
查看>>
UVC摄像头-学习
查看>>
深入理解多线程(四)—— Moniter的实现原理
查看>>
前端面试中常考的源码实现
查看>>
vue基于viewer实现的图片查看器
查看>>
HTML、CSS、JavaScript
查看>>
Html5的新特性总结
查看>>
来一个阿里妈妈字体图标的简单说明书吧
查看>>
git 入门教程之撤销更改
查看>>
React在线编辑国际化文本
查看>>
了解多线程!
查看>>
Android Jetpack架构组件之 Paging(使用、源码篇)
查看>>
Day 4
查看>>
面向对象(理解对象)——JavaScript基础总结(一)
查看>>
写项目代码之前必须要做的事
查看>>
别装啦!一看就知道你要跳槽了.....
查看>>