一、简述

  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兄弟线程间数据信息交换的更多相关文章

  1. Exchanger实现线程间数据交换

    package com.duchong.concurrent; import java.util.ArrayList; import java.util.List; import java.util. ...

  2. Java并发:线程间数据传递和交换

    转自:https://www.cnblogs.com/java-zzl/p/9741288.html 一.通过SynchronousQueue方式实现线程间数据传递: 线程A与线程B共同持有一个Syn ...

  3. Java并发工具类之线程间数据交换工具Exchanger

    Exchanger是一个用于线程间协做的工具类,主要用于线程间的数据交换.它提供了一个同步点,在这个同步点,两个线程可以彼此交换数据.两个线程通过exchange方法交换数据,如果一个线程执行exch ...

  4. Disruptor——一种可替代有界队列完成并发线程间数据交换的高性能解决方案

    本文翻译自LMAX关于Disruptor的论文,同时加上一些自己的理解和标注.Disruptor是一个高效的线程间交换数据的基础组件,它使用栅栏(barrier)+序号(Sequencing)机制协调 ...

  5. 多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)

    多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码 ...

  6. 多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)

    ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...

  7. 多线程多进程学习threading,queue线程安全队列,线程间数据状态读取。threading.local() threading.RLock()

    http://www.cnblogs.com/alex3714/articles/5230609.html python的多线程是通过上下文切换实现的,只能利用一核CPU,不适合CPU密集操作型任务, ...

  8. 并发工具类(四)线程间的交换数据 Exchanger

    前言   JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...

  9. C#不同窗体间数据传递

    在做项目中经常会使用不同窗体之间的值,所以就有了传值的概念.最常见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道. 1.       如果很多窗体都需要用到某一窗体的东西,比如登录窗体记 ...

随机推荐

  1. cocos2d-x升级到3.4与创建android项目

    cocos2d-x升级到3.4与创建android项目 1 升级安装cocos2d-x windows7 64位机器, 到官网下载cocos2d-x-3.4: http://www.cocos2d-x ...

  2. ”()“和”[]“引发的血案——由此引出C++中关键词new

    先来看一个程序吧: #include <iostream> #include <cassert> using namespace std; int main() { ; int ...

  3. Junit指定测试执行顺序

    原文链接: Test execution order原文日期: 2012年12月06日翻译日期: 2014年7月2日翻译人员: 铁锚说明: Junit4.11版本及以后才支持,建议升级到最新版本.按照 ...

  4. HBase提供的工具

    1 .压缩测试工具   hbase org.apache.hadoop.hbase.util.CompressionTest   1G数据不同的压缩算法得到的结果 +----------------- ...

  5. objective-c 2.0的字面量Literals

    obj-c 2.0增加了许多核心对象字面量的简单语法,向ruby学习吗? 直接上代码: #import <Foundation/Foundation.h> int main(void){ ...

  6. 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 ...

  7. 杭电ACM 1001题

    import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=ne ...

  8. 剑指offer面试题48: 最长不含重复字符的子字符串

    Given a string, find the length of the longest substring without repeating characters.(请从子字符串中找出一个最长 ...

  9. python 3下基于select模型的事件驱动机制程序

    它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程.它的流程如图: 当用户进程调用了select,那么整个 ...

  10. 关于linux防火墙

    1.防火墙是什么:防火墙就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防火墙如何工作 ...