线程同步工具(七)在并发任务间交换数据
声明:本文是《 Java 7 Concurrency Cookbook 》的第三章, 作者: Javier Fernández González 译者:郑玉婷
在并发任务间交换数据Java 并发 API 提供了一种允许2个并发任务间相互交换数据的同步应用。更具体的说,Exchanger 类允许在2个线程间定义同步点,当2个线程到达这个点,他们相互交换数据类型,使用第一个线程的数据类型变成第二个的,然后第二个线程的数据类型变成第一个的。
这个类在遇到类似生产者和消费者问题时,是非常有用的。来一个非常经典的并发问题:你有相同的数据buffer,一个或多个数据生产者,和一个或多个数据消费者。只是Exchange类只能同步2个线程,所以你只能在你的生产者和消费者问题中只有一个生产者和一个消费者时使用这个类。
在这个指南,你将学习如何使用 Exchanger 类来解决只有一个生产者和一个消费者的生产者和消费者问题。
准备
这个指南的例子使用Eclipse IDE实现。如果你使用Eclipse或其他IDE,如NetBeans,打开它并创建一个新的Java项目。
怎么做呢…
按照这些步骤来实现下面的例子:
// 3. 声明 Exchanger List String ; 对象,名为exchanger。这个 exchanger 对象是用来同步producer和consumer的。
for (int i = 0; i 10; i++) { System.out.printf("Producer: Cycle %d\n", cycle);
// 7. 调用 exchange() 方法来与consumer交换数据。此方法可能会抛出InterruptedException 异常, 加上处理代码。
// 10. 声明一个名为exchanger的 Exchanger List String 对象。用来同步 producer和consumer。
// 13. 在每次循环,首先调用exchange()方法来与producer同步。Consumer需要消耗数据。此方法可能会抛出InterruptedException异常, 加上处理代码。
// 14. 把producer发来的在buffer里的10字符串写到操控台并从buffer内删除,留空。System.out.println("Consumer: " + buffer.size());
它是怎么工作的…
消费者开始时是空白的buffer,然后调用Exchanger来与生产者同步。因为它需要数据来消耗。生产者也是从空白的buffer开始,然后创建10个字符串,保存到buffer,并使用exchanger与消费者同步。
在这儿,2个线程(生产者和消费者线程)都是在Exchanger里并交换了数据类型,所以当消费者从exchange() 方法返回时,它有10个字符串在buffer内。当生产者从 exchange() 方法返回时,它有空白的buffer来重新写入。这样的操作会重复10遍。
如你执行例子,你会发现生产者和消费者是如何并发的执行任务和在每个步骤它们是如何交换buffers的。与其他同步工具一样会发生这种情况,第一个调用 exchange()方法会进入休眠直到其他线程的达到。
更多…
Exchanger 类有另外一个版本的exchange方法:
exchange(V data, long time, TimeUnit unit):V是声明Phaser的参数种类(例子里是 List)。 此线程会休眠直到另一个线程到达并中断它,或者特定的时间过去了。TimeUnit类有多种常量:DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS, 和 SECONDS。【多线程与高并发】- 线程基础与状态 所谓线程就是操作系统(OS)能够进行运算调度的最小单位,是一个基本的CPU执行单元,也是执行程序流的最小单元。能够提高OS的并发性能,减小程序在并发执行时所付出的时空开销。线程是进程的一个实体,是被系统独立调度和分派的基本单位。
Java多线程虽然知识点众多,但抓住了基础,也不难解决。 接着上一篇并发基础,再说一些额外的知识点。上篇文章我们说了线程的状态,还有线程的一些属性。这次我们再说一些Thread类的用法,再说下线程组的概念。
线程是轻量级的进程,进程可以说是线程的容器。线程是程序执行的最小单位。使用多线程而不是使用多进程进行并发程序的设计,因为线程的切换和调度成本远远小于进程。
ali清英 方腾飞,花名清英,英文名kiral,并发编程网创始人,支付宝技术专家,《Java并发编程的艺术》作者。
相关文章
- 并发工具类(二)同步屏障CyclicBarrier
- 线程同步工具(二)控制并发访问多个资源
- 【并发技术16】线程同步工具Exchanger的使用
- Microsoft SyncToy 文件同步工具
- 同步工具类—— CountDownLatch
- java的两种同步方式, Synchronized与ReentrantLock的区别
- 用Aliyun E-MapReduce集群的sqoop工具和数据库同步数据如何配置网络
- TDengine可通过数据同步工具 DataX读写
- Atitit.Gui控件and面板----db数据库区----- .数据库比较同步工具 vOa
- Android 10.0 framework设备联网后系统时间没有自动同步更新的修改
- 基于QPSK的载波同步和定时同步性能仿真,包括Costas环的gardner环
- DataGrip设置长sql语句自动换行 & Navicat工具 结构同步 & idea启动maven项目报:'@' that cannot start any token. (Do not use @ for indentation)
- 使用vs code的sftp 同步远程文件功能
- 创建与carla同步的sumo的联网方法
- rsync+inotify实时同步——筑梦之路
- 大数据Hadoop之——数据同步工具Sqoop
- Hadoop入门(十二):集群时间同步
- 2A持续电流,3A峰值负载电流,丝印KVBPC,SOT23-5,DC-DC同步降压,型号SY8089