展开

关键词

Java Concurrent Exchanger

前言 Exchanger是JUC里提供的供两个线程之间交换数据或者交互的一个并发工具,API也非常简单就两个重载的exchange泛型方法。 看一下demo: import java.util.concurrent.Exchanger; public class ExchangerDemo { static Exchanger exchanger = new Exchanger(); static void startReadThread(){ new Thread(new Runnable() {

20540

Exchanger的使用

Exchanger的作用是可以用来进行线程间数据的交换。线程可以调用Exchanger中的exchange()方法来交换数据。 也就是说用Exchanger中的exchange()方法可以使线程间通信并互相交换信息。在日常开发中可以用Exchanger类的exchange()方法处理数据校验的工作。

27920
  • 广告
    关闭

    90+款云产品免费体验

    提供包括云服务器,云数据库在内的90+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    并发编程之Exchanger

    一、简介 Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。 注:Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。 二、Exchanger的应用场景 Exchanger可以用于遗传算法,遗传算法里需要选出两个人作为交配对象,这时候会交换两人的数据,并使用交叉规则得出2个交配结果。 Exchanger也可以用于校对工作。 代码如下: public class ExchangerTest { private static final Exchanger<String> exgr = new Exchanger<String

    48960

    Java并发编程之Exchanger

    简介 Exchanger是一个用于线程间数据交换的工具类,它提供一个公共点,在这个公共点,两个线程可以交换彼此的数据。 Exchanger的使用 方法介绍 exchange(V x):阻塞当前线程,直到另外一个线程调用exchange方法或者当前线程被中断。 x : 需要交换的对象。 示例1:A同学和B同学交换各自收藏的大片 public class Demo { public static void main(String[] args) { Exchanger <String> stringExchanger = new Exchanger<>(); Thread studentA = new Thread(() -> { <String> stringExchanger = new Exchanger<>(); Thread studentA = new Thread(() -> {

    11510

    java线程中Exchanger使用

    有时我们需要对元素进行配对和交换线程的同步点,使用exchange方法 返回其伙伴的对象,这时我们就需要使用线程类中的Exchanger类了, 我通过一个实例 来简单说明一下他的使用方法及其作用 String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); final Exchanger <String> exchanger = new Exchanger<String>(); executor.execute(new Runnable() { String data1

    23330

    Java并发编程--Exchanger

    Exchanger 可被视为 SynchronousQueue 的双向形式。Exchanger在遗传算法和管道设计等应用中很有用。    内存一致性:对于通过 Exchanger 成功交换对象的每对线程,每个线程中在 exchange() 之前的操作 happen-before 从另一线程中相应的 exchange() 返回的后续操作。 1 class FillAndEmpty { 2 Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>(); 3 DataBuffer 参考资料:   (《java.util.concurrent 包源码阅读》18 Exchanger)http://www.cnblogs.com/wanly3643/p/3939552.html   ( Jdk1.6 JUC源码解析(27)-Exchanger)http://brokendreams.iteye.com/blog/2253956   (Java多线程 -- JUC包源码分析16 -- Exchanger

    26140

    理解Java并发工具类Exchanger

    Exchanger在遗传算法和管道设计比较有用。 下面先来看一个简单的交换例子: public static void main(String[] args) { Exchanger exchanger=new Exchanger() (); } static class Worker implements Runnable{ Exchanger exchanger; Object object; public Worker(Exchanger exchanger, Object object) { this.exchanger = exchanger 快递员就是生产者,我们本身就是消费者,而柜子就成为了我们媒介容器,看下面的一个例子: static Exchanger<DataBuffer<Integer>> exchanger=new Exchanger

    66620

    java多线程系列:Semaphore和Exchanger

    本篇文章将介绍Semaphore和Exchanger这两个并发工具类。 Semaphore 信号量(英语:Semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值。 Exchanger主要用于线程间的数据交换。 exchanger; public ExchangerRunnable(String name, Exchanger exchanger, Object data) { this.exchanger exchanger = new Exchanger(); private static ExecutorService service = Executors.newFixedThreadPool , "A")); service.submit(new ExchangerRunnable("2", exchanger, "B")); service.shutdown

    31420

    (juc系列)exchanger源码阅读

    Exchanger可以看做是一个双向的SynchronousQueue. 这个类在遗传算法和流水线设计时很有用. 示例 这个类使用Exchanger来在线程之间交换缓冲区. class FillAndEmpty { Exchanger<DataBuffer> exchanger = new Exchanger Thread(new FillingLoop()).start(); new Thread(new EmptyingLoop()).start(); } } 一个生产者和一个消费者通过Exchanger 源码阅读 构造方法 public Exchanger() { participant = new Participant(); } 初始化一个Participant. 该位置没有值,且下标合理,就将当前节点放到该位置上 该位置没有值,下标不合理,就重新计算下标 总结 Exchanger的作用,原理都比较明了,就是代码细节比较难懂. 完。

    8720

    并发工具类Phaser、Exchanger使用

    ."); } } 0x02:Exchanger Exchanger是什么? 它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。 因此使用Exchanger的中断时成对的线程使用exchange()方法,当有一对线程到达了同步点,就会进行交换数据,因此该工具类的线程对象是成对的。 线程可以在成对内配对和交换元素的同步点。 常用方法: Exchanger 泛型类型,其中V表示可交换的数据类型 V exchanger(V v):等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送该线程,并接收该线程的对象 V exchanger(V v, long timeout, TimeUnit unit):等待另一个线程到达此交换点(除非当前线程被中断或超出类指定的等待时间),然后将给定的对象传送给该线程,并接收该线程的对象 <String> exchanger = new Exchanger<>(); new Thread() { @Override public

    13610

    Java并发-28.并发工具类-Exchanger

    Exchanger用于进行线程间的数据交换。 提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。 java.util.concurrent.Executors; /** * @author pengjunzhe */ public class ExchangerTest { private static Exchanger <String> exchanger = new Exchanger<>(); private static ExecutorService threadpool = Executors.newFixedThreadPool

    16730

    使用Exchanger实现线程间的数据交换

    Exchanger相关类图 Exchanger通过Lock和Condition来完成功能,Exchanger的一个重要的public方法是exchange方法,用于线程的数据交换, 相关的类图以及详细的 Exchanger工具类的使用案例 案例描述 完成一个简单的例子,实现两个线程之间交换数据,用Exchanger来做非常简单。 5); public ThreadA(Exchanger<Integer> exchanger) { this.exchanger = exchanger; } public void 10); public ThreadB(Exchanger<Integer> exchanger) { this.exchanger = exchanger; } public <Integer> exchanger = new Exchanger<Integer>(); new Thread(new ThreadA(exchanger)).start(); new

    23210

    【死磕Java并发】—–J.U.C之并发工具类:Exchanger

    Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。 Exchanger,它允许在并发任务之间交换数据。 <List<String>> exchanger; Producer(List<String> buffer,Exchanger<List<String>> exchanger){ <List<String>> exchanger; public Consumer(List<String> buffer, Exchanger<List<String>> exchanger 消费中通过调用Exchanger与生产者进行同步来获取数据,而生产者则通过for循环向缓存队列存储数据并使用exchanger对象消费者同步。 在Exchanger中,如果一个线程已经到达了exchanger节点时,对于它的伙伴节点的情况有三种: 如果它的伙伴节点在该线程到达之前已经调用了exchanger方法,则它会唤醒它的伙伴然后进行数据交换

    51660

    【死磕 Java 并发】—– J.U.C 之并发工具类:Exchanger

    Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。 Exchanger,它允许在并发任务之间交换数据。 <List<String>> exchanger; Producer(List<String> buffer,Exchanger<List<String>> exchanger){ <List<String>> exchanger; public Consumer(List<String> buffer, Exchanger<List<String>> exchanger 消费中通过调用Exchanger与生产者进行同步来获取数据,而生产者则通过for循环向缓存队列存储数据并使用exchanger对象消费者同步。 在Exchanger中,如果一个线程已经到达了exchanger节点时,对于它的伙伴节点的情况有三种: 如果它的伙伴节点在该线程到达之前已经调用了exchanger方法,则它会唤醒它的伙伴然后进行数据交换

    19810

    【原创】Java并发编程系列25 | 交换器Exchanger

    Exchanger是一个用于线程间协作的工具类,用于两个线程间交换。本篇只介绍Exchanger的使用,不讲解源码。 (因Exchanger类的源码很是复杂,而且对平时开发设计借鉴意义也不是很大,所以本人至今没有彻底研究明白,也就不在这里误导大家了。) Exchanger提供了一个交换的同步点,在这个同步点两个线程能够交换数据。 用一个简单的例子来看下Exchanger的具体使用。两方做交易,如果一方先到要等另一方也到了才能交易,交易就是执行exchange方法交换数据。 public class ExchangerTest { private static Exchanger<String> exchanger = new Exchanger<String>()

    17210

    dubbo源码之Proxy、Transporter和Exchanger执行过程

    url.addParameterIfAbsent(Constants.CODEC_KEY, "exchange"); return getExchanger(url).bind(url, handler);} public static Exchanger Constants.EXCHANGER_KEY, Constants.DEFAULT_EXCHANGER); return getExchanger(type);} public static Exchanger getExchanger(String type) { //这里是加载Exchanger的spi拓展点信息 return ExtensionLoader.getExtensionLoader (Exchanger.class).getExtension(type);} 加载Exchanger并通过type进行匹配,默认是使用的是HeaderExchanger ? 总结 本文以DubboNamespaceHandler为入口对Server和Client的初始化以及初始化过程中涉及到的Proxy、Transporter和Exchanger进行了一个流程梳理。

    18820

    让两个线程安全的交换对象 顶

    public class ProducerTask implements Runnable { private final Exchanger<char[]> exchanger; private <char[]> exchanger,char[] buffer,long seed) { this.exchanger = exchanger; this.buffer index = 0; public SteadTask(Exchanger<char[]> exchanger, char[] buffer,long seed) { this.exchanger <char[]> exchanger = new Exchanger<>(); char[] buffer1 = new char[10]; char[] buffer2 Thread(new ConsumerTask(exchanger,buffer2,265358)).start(); new Thread(new SteadTask(exchanger

    19230

    java并发编程JUC第十一篇:如何在线程之间进行对等数据交换

    两个线程可以使用Exchanger交换数据,下图用来说明Exchanger的作用 ? 在下面的代码中 首先我们定义了一个Exchanger,用于数据交换 然后定义了两个线程对象bookExchanger1和bookExchanger2,两个线程都持有Exchanger交换器对象用于数据交换 BookExchanger 继承自Runnable代表参与换书的换书读者,他持有Exchanger数据交换器用于交换图书。 public class BookExchanger implements Runnable{ Exchanger<String> exchanger = null; //数据交换器 String[] books = null; //图书数组 public BookExchanger(Exchanger<String> exchanger, String[] books

    12430

    Hive 创建外部表 原

    /stocks/NASDAQ/AAPL'; alter table stocks_external add partition(exchanger="NASDAQ", symbol="INTC") location '/user/bigdata/stocks/NASDAQ/INTC'; alter table stocks_external add partition(exchanger="NYSE , price_close from stocks_external where exchanger = 'NASDAQ' and symbol = 'AAPL' limit 10; select exchanger , symbol, count(*) from stocks_external group by exchanger,symbol; select exchanger, symbol, max(price_high ) from stocks_external group by exchanger, symbol; 5.

    1.1K30

    相关产品

    • 云服务器

      云服务器

      云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。 腾讯云服务器(CVM)为您提供安全可靠的弹性云计算服务。只需几分钟,您就可以在云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。

    相关资讯

    热门标签

    扫码关注云+社区

    领取腾讯云代金券