Java线程之Exchanger
Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。
当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行
public class ThreadLocalTest {public static void main(String[] args) {Exchanger<List<Integer>> exchanger = new Exchanger<>();new Consumer(exchanger).start();new Producer(exchanger).start();}}class Producer extends Thread {List<Integer> list = new ArrayList<>();Exchanger<List<Integer>> exchanger = null;public Producer(Exchanger<List<Integer>> exchanger) {super();this.exchanger = exchanger;}@Overridepublic void run() {Random rand = new Random();for(int i=0; i<10; i++) {list.clear();list.add(rand.nextInt(10000));list.add(rand.nextInt(10000));list.add(rand.nextInt(10000));list.add(rand.nextInt(10000));list.add(rand.nextInt(10000));try {list = exchanger.exchange(list);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}class Consumer extends Thread {List<Integer> list = new ArrayList<>();Exchanger<List<Integer>> exchanger = null;public Consumer(Exchanger<List<Integer>> exchanger) {super();this.exchanger = exchanger;}@Overridepublic void run() {for(int i=0; i<10; i++) {try {list = exchanger.exchange(list);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.print(list.get(0)+", ");System.out.print(list.get(1)+", ");System.out.print(list.get(2)+", ");System.out.print(list.get(3)+", ");System.out.println(list.get(4)+", ");}}
}
Java线程之Exchanger相关推荐
- Java多线程之Exchanger
import java.util.concurrent.Exchanger;/*** Exchanger让两个线程可以互换信息.* 例子中服务生线程往空的杯子里倒水,顾客线程从装满水的杯子里喝水,* ...
- exchanger java_(十二)java多线程之Exchanger
引言 今天我们讲最后一个同步工具类Exchanger,这个比较简单,就是让两个线程交换数据. 理论 Exchanger只有两个方法而已,而且两个还是一样的,只是参数不通而已 exchange(V x) ...
- java线程之InheritableThreadLocal
ThreadLocal和InheritableThreadLocal区别,可以用代码测试一下: [java] view plain copy package com.lang; import juni ...
- Java线程之Synchronized用法
synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对 ...
- (JAVA)线程之lock和死锁(例)
package thread; import java.util.concurrent.locks.*;/*** @author Alina* @date 2021年12月20日 11:07 下午* ...
- C++/Java线程之分
JAVA线程状态图 1.C++/windows中主线程结束,其他线程必然死亡(即使调用pthread_detach解除父子关系,主线程消亡时也会导致子线程被迫关闭). ----1.1 一个进程中可以有 ...
- Java线程之CompletionService批处理任务
如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果,怎么办呢? 为此你可以保存与每个任务相关联的Future,然后不断地调用 timeout为零的get,来检验Future是否 ...
- Java线程之CompletionService
当使用ExecutorService启动了多个Callable后,每个Callable会产生一个Future,我们需要将多个Future存入一个线性表,用于之后处理数据.当然,还有更复杂的情况,有5个 ...
- Java线程之setDaemon(true)方法的作用
一.线程 JAVA线程分为即实线程与守护线程,守护线程是优先级低,存活与否不影响JVM的退出的线程,实现守护线程的方法是在线程start()之前setDaemon(true),否则会抛出一个Illeg ...
最新文章
- linux服务器多网卡bond
- 后台参数验证的几种方式
- Oracle的分区操持
- Java调用JavaScript
- 【线性规划和网络流24题】
- 去除 计算机里面的百度云管家,WIN7如何彻底清除“百度云管家”图标或残留文件?...
- 如何找出Fiori launchpad URL start_up请求发起的具体位置
- 有没有一段代码,让你觉得人类的智慧也可以璀璨无比?【转】
- .NET6之MiniAPI(十七):缓存
- netflix测试能不能看_Netflix监管者测试–引入知事,准官员
- 一家典型的云原生企业,如何在创业早期数次“弯道超车”?
- L1-073 人与神 (5 分)-PAT 团体程序设计天梯赛 GPLT
- kubernetes Pod yaml解析注释
- 正则表达式-2-正则表达式实战1
- C语言 case语句 连续值,对一个switch case语句使用两个值
- 【绝知此事要躬行】线性表之数组OJ
- (CVPR-2018)Non-local Neural Networks
- 信息与熵【上】生命以信息为食
- 一场“测谎”人机对战背后的故事:度小满的技术进击之路
- 【刷爆LeetCode】七月算法集训(14)栈
热门文章
- 中国SCR脱硝催化剂行业竞争现状分析与未来需求预测报告2022-2028年
- PLC的顺控继电器(SCR编程)总结
- 业务消息中心系统设计与实现(一)
- 无心剑七绝147首[1994年~2021年]
- jeecg-boot自动生成代码_PSIM 仿真:如何使用 PSIM12 自动生成代码
- 云基础架构安全_这是使您的云基础架构稳定,安全和可扩展的方法。
- Hey UI源码市场
- SQLServer 查询分析器里大小写转换快捷键
- mac book 华为C8815不能debug
- windows编写linux脚本,适用于 Windows 和 Linux 的脚本编写工具包