JAVA语言并发编程之线程交换器Exchanger(V)
小标 2019-01-18 来源 : 阅读 819 评论 0

摘要:本文主要向大家介绍了JAVA语言并发编程之线程交换器Exchanger(V),通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言并发编程之线程交换器Exchanger(V),通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

一、定义


每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。


内存一致性效果:对于通过 Exchanger 成功交换对象的每对线程,每个线程中在 exchange() 之前的操作 happen-before 从另一线程中相应的 exchange() 返回的后续操作。(内存一致性效果被称为happen-before),简单的例子:当一个线程进行写入操作,另一个线程进行读取操作,保证一个线程写入的结果对另一个线程的读取是可视的。


二、用法


package cn.itcast.heima2;

import java.util.concurrent.Exchanger;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

 

public class ExchangerTest {

 

    public static void main(String[] args) {

        ExecutorService service = Executors.newCachedThreadPool();

        final Exchanger exchanger = new Exchanger<>();

        service.execute(new Runnable(){

            public void run() {

                try {               

                    String data1 = "恭喜发财!";

                    System.out.println("线程" + Thread.currentThread().getName() + 

                    "正在把数据:" + data1 +"换出去");

                    Thread.sleep((long)(Math.random()*10000));

                    String data2 = exchanger.exchange(data1);

                    System.out.println("线程" + Thread.currentThread().getName() + 

                    "换回的数据为:" + data2);

                }catch(Exception e){

                     

                }

            }   

        });

        service.execute(new Runnable(){

            public void run() {

                try {               

 

                    String data1 = "乖,给你一个红包!";

                    System.out.println("线程" + Thread.currentThread().getName() + 

                    "正在把数据:" + data1 +"换出去");

                    Thread.sleep((long)(Math.random()*10000));                  

                    String data2 = exchanger.exchange(data1);

                    System.out.println("线程" + Thread.currentThread().getName() + 

                    "换回的数据为:" + data2);

                }catch(Exception e){

                     

                }               

            }   

        });     

    }

}

   



三、JDK中的例子


使用?Exchanger?在线程间交换缓冲区,因此,在需要时,填充缓冲区的线程获取一个新腾空的缓冲区,并将填满的缓冲区传递给腾空缓冲区的线程。


class FillAndEmpty {

   Exchanger exchanger = new Exchanger();

   DataBuffer initialEmptyBuffer = ... a made-up type

   DataBuffer initialFullBuffer = ...

 

   class FillingLoop implements Runnable {

     public void run() {

       DataBuffer currentBuffer = initialEmptyBuffer;

       try {

         while (currentBuffer != null) {

           addToBuffer(currentBuffer);

           if (currentBuffer.isFull())

             currentBuffer = exchanger.exchange(currentBuffer);

         }

       } catch (InterruptedException ex) { ... handle ... }

     }

   }

 

   class EmptyingLoop implements Runnable {

     public void run() {

       DataBuffer currentBuffer = initialFullBuffer;

       try {

         while (currentBuffer != null) {

           takeFromBuffer(currentBuffer);

           if (currentBuffer.isEmpty())

             currentBuffer = exchanger.exchange(currentBuffer);

         }

       } catch (InterruptedException ex) { ... handle ...}

     }

   }

 

   void start() {

     new Thread(new FillingLoop()).start();

     new Thread(new EmptyingLoop()).start();

   }

  }

   



四、API


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程