Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型
http://blog.csdn.net/a352193394/article/details/39503857
java 线程池 并行 执行 http://www.cnblogs.com/donaldlee2008/p/5290169.html

版权声明:本文为博主原创文章,未经博主允许不得转载。
在多线程中,两个线程之间交换数据是非常常见的情况,我们可以使用公共的数据结构,同样,Java也提供了很好
的类供我们使用,那就是Exchanger类,这个类可以帮助我们在两个线程之间同步数据结构,下面我们以这个类再来实
现一遍生产者消费者模型,貌似这个模型已经被写烂了。
- package com.bird.concursey.charpet5;
- import java.util.List;
- import java.util.concurrent.Exchanger;
- public class Producer implements Runnable {
- //This will be the data structure that the producer will interchange with the consumer.
- private List<String> buffer;
- private Exchanger<List<String>> exchanger;
- public Producer(List<String> buffer, Exchanger<List<String>> exchanger) {
- super();
- this.buffer = buffer;
- this.exchanger = exchanger;
- }
- @Override
- public void run() {
- int cycle = 1;
- for(int i = 0; i < 10; i++) {
- System.out.printf("Producer: Cycle %d\n",cycle);
- for (int j=0; j<10; j++){
- String message="Event "+((i*10)+j);
- System.out.printf("Producer: %s\n",message);
- buffer.add(message);
- }
- try {
- buffer = exchanger.exchange(buffer);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println("Producer: "+buffer.size());
- cycle++;
- }
- }
- }
- package com.bird.concursey.charpet5;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.Exchanger;
- public class Consumer implements Runnable {
- private List<String> buffer;
- private Exchanger<List<String>> exchange;
- public Consumer(List<String> buffer, Exchanger<List<String>> exchange) {
- super();
- this.buffer = buffer;
- this.exchange = exchange;
- }
- @Override
- public void run() {
- int cycle = 1;
- for(int i = 0; i < 10; i++) {
- System.out.printf("Consumer: Cycle %d\n",cycle);
- try {
- buffer = exchange.exchange(buffer);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("Consumer: "+buffer.size());
- for (int j=0; j<10; j++){
- String message=buffer.get(0);
- System.out.println("Consumer: "+message);
- buffer.remove(0);
- }
- cycle++;
- }
- }
- public static void main(String[] args) {
- List<String> buffer1 = new ArrayList<String>();
- List<String> buffer2 = new ArrayList<String>();
- Exchanger<List<String>> exchange = new Exchanger<List<String>>();
- Producer producer = new Producer(buffer1, exchange);
- Consumer consumer = new Consumer(buffer2, exchange);
- Thread threadProducer=new Thread(producer);
- Thread threadConsumer=new Thread(consumer);
- threadProducer.start();
- threadConsumer.start();
- }
- }
- The consumer begins with an empty buffer and calls Exchanger to synchronize with the
- producer. It needs data to consume. The producer begins its execution with an empty buffer.
- It creates 10 strings, stores it in the buffer, and uses the exchanger to synchronize with
- the consumer.
- At this point, both threads (producer and consumer) are in Exchanger and it changes the
- data structures, so when the consumer returns from the exchange() method, it will have a
- buffer with 10 strings. When the producer returns from the exchange() method, it will have
- an empty buffer to fill again. This operation will be repeated 10 times.
- If you execute the example, you will see how producer and consumer do their jobs
- concurrently and how the two objects interchange their buffers in every step. As it occurs with
- other synchronization utilities, the first thread that calls the exchange() method was put to
- sleep until the other threads arrived.
Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型的更多相关文章
- JAVA多线程学习八-多个线程之间共享数据的方式
多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...
- Android多线程研究(5)——线程之间共享数据
一.如果是每个线程都执行相同的代码,则可以使用同一个Runnable来实现共享 public class MultiThreadShareData { public static void main( ...
- Java生产者消费者模型
在Java中线程同步的经典案例,不同线程对同一个对象同时进行多线程操作,为了保持线程安全,数据结果要是我们期望的结果. 生产者-消费者模型可以很好的解释这个现象:对于公共数据data,初始值为0,多个 ...
- java多线程:线程间通信——生产者消费者模型
一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库 ...
- Java并发工具类(四):线程间交换数据的Exchanger
简介 Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法 ...
- java 线程池、多线程实战(生产者消费者模型,1 vs 10) 附案例源码
导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...
- java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法
在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...
随机推荐
- Activiti(工作流)如何关联业务表
注(version:5.15.1) 1.部署流程(定义流程) InputStream in = new FileInputStream(file); ZipInputStream zipInputSt ...
- Linux常用命令汇总及使用方法(一)
最近开始学习Linux,但是因为原来没有接触过,所有现在先将Linux中常用的命令记录下来,方便自己后期使用. 1.登陆 通过secureCRT/xshell/ssh等软件远程登陆Linux (1)# ...
- DNS服务架设 redhat linux
安装dns服务和管理工具 yum install bind bind-chroot bind-utils -y 服务名为named 在没有启动服务之前服务的主配置文件在/etc/named.con ...
- Android KeyCode
KEYCODE_UNKNOWN=0; KEYCODE_SOFT_LEFT=1; KEYCODE_SOFT_RIGHT=2; KEYCODE_HOME=3; KEYCODE_BACK=4; KEYCOD ...
- php 编程效率(2)
1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的 ...
- jQuery(5)——动画
jQuery中的动画 [show()方法和hide()方法] 在HTML文档中,为一个元素调用hide()方法,会将该元素的display样式改为“none”,show()方法将元素的display样 ...
- github import repository创建github仓库
现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆. 首先,登陆GitHub,创建一个新的仓库,名字叫blog: 1.先创建一个项目仓库 2. 我们勾选Initialize th ...
- CentOS6.2编译gcc失败,kernel-headers错误
准备转移到阿里云服务器,用的CentOS6.2 x64,虚拟机上用的 6.3版本,测试重装了好几次都没问题了,结果在云服务器上刚开始就出问题了... yum 安装的时候居然出错了,靠...网上 goo ...
- [转]修改python默认的编码方式
今天碰到了 python 编码问题, 报错信息如下Traceback (most recent call last): File "ntpath.pyc", line 108, ...
- 分享给大家一个简单的数据导出excel类
<?php /** * 生成excel文件操作 * * @author wesley wu * @date 2013.12.9 */ class Excel { private $limit = ...