12、Exchanger

java.util.concurrent

Class Exchanager<V>

用于实现两个线程之间元素的交换。每个线程在完成一定的事务后想与另外一个线程交换数据,第一个拿出数据的线程一直等待第一个拿出

数据的线程,直到两个线程都拿出数据,才能进行数据交换。Exchanger对于遗传数学和管道设计应用也许很有用。

 1 class FillAndEmpty {
 2    Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>();
 3    DataBuffer initialEmptyBuffer = ...
 4    DataBuffer initialFullBuffer = ...
 5
 6    class FillingLoop implements Runnable {
 7      public void run() {
 8        DataBuffer currentBuffer = initialEmptyBuffer;
 9        try {
10          while (currentBuffer != null) {
11            addToBuffer(currentBuffer);
12            if (currentBuffer.isFull())
13              currentBuffer = exchanger.exchange(currentBuffer);
14          }
15        } catch (InterruptedException ex) { ... handle ... }
16      }
17    }
18
19    class EmptyingLoop implements Runnable {
20      public void run() {
21        DataBuffer currentBuffer = initialFullBuffer;
22        try {
23          while (currentBuffer != null) {
24            takeFromBuffer(currentBuffer);
25            if (currentBuffer.isEmpty())
26              currentBuffer = exchanger.exchange(currentBuffer);
27          }
28        } catch (InterruptedException ex) { ... handle ...}
29      }
30    }
31
32    void start() {
33      new Thread(new FillingLoop()).start();
34      new Thread(new EmptyingLoop()).start();
35    }
36  }

程序分析:

有两个线程,一个是填充数据缓存,一个是消耗数据缓存。两个线程都是通过while语句来对各自的DataBuffer类型的数据进行判断。说明这是一个循环生产与消费的类型。

当填充线程将缓存容器填充满了之后,交到"交易平台"Exchanger;当消费线程从当前的缓存容器中拿取缓存数据直至为空时,就将缓存容器交到"交易平台"Exchanger。

假设消费线程比较早的启动了,此时缓存容器中数据为空,因此它会将其提交到Exchanger,但是此时,消费线程的exchange并不会返回值,而是阻塞于此。当填充线程

将缓存容器填充满,交到Exchanger后,消费线程的exchange会返回消费线程提交到Exchanger的空的缓存容器;与此同时,消费线程从exchange唤醒并返回填充线程

提交到Exchanger的填充好数据的缓存容器。

时间: 2024-08-07 19:38:07

12、Exchanger的相关文章

Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger

前言 在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码.之前讲过的线程池.BlockingQueue都是在java.util.concurrent下的组件,Timer虽然不在java.util.concurrent下,但也算是.后两篇文章将以例子的形式简单讲解一些多线程下其他组件的使用,不需要多深刻的理解,知道每个组件大致什么作用就行. 本文主要讲解的是Cou

【ThinkingInC++】12、宏处理定义

/** * 功能:宏处理定义 * 时间:2014年8月12日20:02:07 * 作者:cutter_point */ #include<iostream> #include<stdlib.h> using namespace std; #define PRINT(STR, VAR) cout<<STR "=" <<VAR<<endl; //这里宏定义之后,所有PRINT("STR", VAR) //都会被

1-2、make_db_file.py

1 #-*- coding: UTF-8 -*- 2 """ 3 用自定义的格式将内存数据库对象保存到文件中: 4 假定数据不使用'endrec.','enddb.'和'=>': 5 假定数据库是字典的字典:警告:使用eval可能存在危险,它会将字符串当作代码执行: 6 也可以使用eval()一次创建一条字典记录: 7 对于print(key,file=dbfile),也可以使用dbfile.write(key + '\n'); 8 """

ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 通用连接和事务管理方法 连接和事务管理是使用数据库的应用程

EC笔记:第二部分:12、复制对象时勿忘其每一个成分

EC笔记:第二部分:12.复制对象时勿忘其每一个成分 1.场景 某些时候,我们不想使用编译器提供的默认拷贝函数(包括拷贝构造函数和赋值运算符),考虑以下类定义: 代码1: class Point{ private: double x; double y; public:         Point()=default; Point(const Point &other){ x=other.x; y=other.y; } const Point& operator=(const Point

intellij idea 12、13 win8 下 中文输入覆盖的问题(搜狗输入法或者其他输入法)

最近升级到idea12,发现中文输入存在问题,输入中文的时候会出现空格,并且覆盖后面的字符,这个问题让我很郁闷. 假设idea的安装位置为:D:\Program Files\JetBrains\IntelliJ IDEA 12.1.2 64位模式下: 1.下载JDK 6 2.安装JDK 6,安装JDK 6 ,假设安装位置为:D:\Program Files\JetBrains\IntelliJ IDEA 12.1.2\jdk64 ,也可以采用其他位置,不需要安装jre. 3.设置环境变量:IDE

【Linux命令详解】12、文本内容显示—[ cat、tac]

12.本节主要学习在linux系统下文本文件内容显示的相关命令,这些命令有cat.tac等. 12.1 cat 使用cat命令可以显示文本文件的内容,也可以把几个文件内容附加到另一个文件中. 12.1.1 命令语法: cat[选项][文件] 12.1.2选项参数: cat命令选项含义 选项                      选项含义 -n                        对输出的所有行编号 -b                        对非空输出行编号 -s     

Windows Phone本地数据库(SQLCE):12、插入数据(翻译)

这是“windows phone mango本地数据库(sqlce)”系列短片文章的第十二篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需要知道的知识点.我将谈谈在windows phone mango本地数据库里怎么插入数据. 插入数据到数据库是一个两个步骤的过程.首先使用InsertOnSubmit 方法添加一个对象到DataContext,然后调用DataContext的SubmitChanges 方法来将保存数据作为数据库中的行. 注

Web服务器管理系列:12、开启关闭Ping命令

有些时候网站打开速度会很慢,我们要排查故障所在,需要用到Ping命令,但是Windows Server 2008防火墙默认是关闭Ping的 我们可以通过以下方法开启Ping 打开防火墙->高级安全: 选择文件和打印机共享(回显请求 - ICMPv4-In) 选择启用: 记得用完Ping后一定要将其关闭,因为DDos攻击就是借助于Ping 这里解释一下: ping 一个发送测试数据包检测网络状况的命令 -l 65500 发送包含65500字节数据量的ECHO数据包 -n 100 发送100遍ECH