Exchanger兄弟线程间数据信息交换
一、简述
Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行。
二、代码示例
public class ExchangerTest {
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<>();
ExecutorService executorService = Executors.newFixedThreadPool(2);
String data = "";
executorService.execute(new Procuder(data, exchanger));
executorService.execute(new Consumer(data, exchanger));
}
}
class Procuder implements Runnable{
private String data;
private Exchanger<String> exchanger;
public Procuder(String data,Exchanger<String> exchanger) {
this.data = data;
this.exchanger = exchanger;
}
@Override
public void run() {
try {
for (int i = 0; i < 5; i++) {
data = new Random().nextInt(1000)+"";
System.out.println("producer"+i+" "+data);
Thread.sleep(new Random().nextInt(5)*1000);
exchanger.exchange(data);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer implements Runnable{
private String data;
private Exchanger<String> exchanger;
public Consumer(String data,Exchanger<String> exchanger) {
this.data = data;
this.exchanger = exchanger;
}
@Override
public void run() {
try {
for (int i = 0; i < 5; i++) {
data = exchanger.exchange(data);
Thread.sleep(new Random().nextInt(5)*1000);
System.out.println("Consumer"+i+" "+data);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
producer0 360
producer1 782
Consumer0 360
producer2 503
Consumer1 782
producer3 367
Consumer2 503
producer4 151
Consumer3 367
Consumer4 151
Exchanger兄弟线程间数据信息交换的更多相关文章
- Exchanger实现线程间数据交换
package com.duchong.concurrent; import java.util.ArrayList; import java.util.List; import java.util. ...
- Java并发:线程间数据传递和交换
转自:https://www.cnblogs.com/java-zzl/p/9741288.html 一.通过SynchronousQueue方式实现线程间数据传递: 线程A与线程B共同持有一个Syn ...
- Java并发工具类之线程间数据交换工具Exchanger
Exchanger是一个用于线程间协做的工具类,主要用于线程间的数据交换.它提供了一个同步点,在这个同步点,两个线程可以彼此交换数据.两个线程通过exchange方法交换数据,如果一个线程执行exch ...
- Disruptor——一种可替代有界队列完成并发线程间数据交换的高性能解决方案
本文翻译自LMAX关于Disruptor的论文,同时加上一些自己的理解和标注.Disruptor是一个高效的线程间交换数据的基础组件,它使用栅栏(barrier)+序号(Sequencing)机制协调 ...
- 多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)
多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码 ...
- 多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...
- 多线程多进程学习threading,queue线程安全队列,线程间数据状态读取。threading.local() threading.RLock()
http://www.cnblogs.com/alex3714/articles/5230609.html python的多线程是通过上下文切换实现的,只能利用一核CPU,不适合CPU密集操作型任务, ...
- 并发工具类(四)线程间的交换数据 Exchanger
前言 JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...
- C#不同窗体间数据传递
在做项目中经常会使用不同窗体之间的值,所以就有了传值的概念.最常见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道. 1. 如果很多窗体都需要用到某一窗体的东西,比如登录窗体记 ...
随机推荐
- cocos2d-x升级到3.4与创建android项目
cocos2d-x升级到3.4与创建android项目 1 升级安装cocos2d-x windows7 64位机器, 到官网下载cocos2d-x-3.4: http://www.cocos2d-x ...
- ”()“和”[]“引发的血案——由此引出C++中关键词new
先来看一个程序吧: #include <iostream> #include <cassert> using namespace std; int main() { ; int ...
- Junit指定测试执行顺序
原文链接: Test execution order原文日期: 2012年12月06日翻译日期: 2014年7月2日翻译人员: 铁锚说明: Junit4.11版本及以后才支持,建议升级到最新版本.按照 ...
- HBase提供的工具
1 .压缩测试工具 hbase org.apache.hadoop.hbase.util.CompressionTest 1G数据不同的压缩算法得到的结果 +----------------- ...
- objective-c 2.0的字面量Literals
obj-c 2.0增加了许多核心对象字面量的简单语法,向ruby学习吗? 直接上代码: #import <Foundation/Foundation.h> int main(void){ ...
- leetcode之旅(7)-Move Zeroes
Move Zeroes 题目描述: Given an array nums, write a function to move all 0's to the end of it while maint ...
- 杭电ACM 1001题
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=ne ...
- 剑指offer面试题48: 最长不含重复字符的子字符串
Given a string, find the length of the longest substring without repeating characters.(请从子字符串中找出一个最长 ...
- python 3下基于select模型的事件驱动机制程序
它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程.它的流程如图: 当用户进程调用了select,那么整个 ...
- 关于linux防火墙
1.防火墙是什么:防火墙就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防火墙如何工作 ...