http://blog.csdn.net/a352193394/article/details/39503857

 Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]
具体看 http://www.cnblogs.com/donaldlee2008/p/5290169.html

java 线程池 并行 执行   http://www.cnblogs.com/donaldlee2008/p/5290169.html

2014-09-23 20:48 1205人阅读 评论(0) 收藏 举报
 分类:
多线程(22) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

在多线程中,两个线程之间交换数据是非常常见的情况,我们可以使用公共的数据结构,同样,Java也提供了很好

的类供我们使用,那就是Exchanger类,这个类可以帮助我们在两个线程之间同步数据结构,下面我们以这个类再来实

现一遍生产者消费者模型,貌似这个模型已经被写烂了。

  1. package com.bird.concursey.charpet5;
  2. import java.util.List;
  3. import java.util.concurrent.Exchanger;
  4. public class Producer implements Runnable {
  5. //This will be the data structure that the producer will interchange with the consumer.
  6. private List<String> buffer;
  7. private Exchanger<List<String>> exchanger;
  8. public Producer(List<String> buffer, Exchanger<List<String>> exchanger) {
  9. super();
  10. this.buffer = buffer;
  11. this.exchanger = exchanger;
  12. }
  13. @Override
  14. public void run() {
  15. int cycle = 1;
  16. for(int i = 0; i < 10; i++) {
  17. System.out.printf("Producer: Cycle %d\n",cycle);
  18. for (int j=0; j<10; j++){
  19. String message="Event "+((i*10)+j);
  20. System.out.printf("Producer: %s\n",message);
  21. buffer.add(message);
  22. }
  23. try {
  24. buffer = exchanger.exchange(buffer);
  25. } catch (InterruptedException e) {
  26. // TODO Auto-generated catch block
  27. e.printStackTrace();
  28. }
  29. System.out.println("Producer: "+buffer.size());
  30. cycle++;
  31. }
  32. }
  33. }
  1. package com.bird.concursey.charpet5;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.concurrent.Exchanger;
  5. public class Consumer implements Runnable {
  6. private List<String> buffer;
  7. private Exchanger<List<String>> exchange;
  8. public Consumer(List<String> buffer, Exchanger<List<String>> exchange) {
  9. super();
  10. this.buffer = buffer;
  11. this.exchange = exchange;
  12. }
  13. @Override
  14. public void run() {
  15. int cycle = 1;
  16. for(int i = 0; i < 10; i++) {
  17. System.out.printf("Consumer: Cycle %d\n",cycle);
  18. try {
  19. buffer = exchange.exchange(buffer);
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. System.out.println("Consumer: "+buffer.size());
  24. for (int j=0; j<10; j++){
  25. String message=buffer.get(0);
  26. System.out.println("Consumer: "+message);
  27. buffer.remove(0);
  28. }
  29. cycle++;
  30. }
  31. }
  32. public static void main(String[] args) {
  33. List<String> buffer1 = new ArrayList<String>();
  34. List<String> buffer2 = new ArrayList<String>();
  35. Exchanger<List<String>> exchange = new Exchanger<List<String>>();
  36. Producer producer = new Producer(buffer1, exchange);
  37. Consumer consumer = new Consumer(buffer2, exchange);
  38. Thread threadProducer=new Thread(producer);
  39. Thread threadConsumer=new Thread(consumer);
  40. threadProducer.start();
  41. threadConsumer.start();
  42. }
  43. }
  1. The consumer begins with an empty buffer and calls Exchanger to synchronize with the
  2. producer. It needs data to consume. The producer begins its execution with an empty buffer.
  3. It creates 10 strings, stores it in the buffer, and uses the exchanger to synchronize with
  4. the consumer.
  1. At this point, both threads (producer and consumer) are in Exchanger and it changes the
  2. data structures, so when the consumer returns from the exchange() method, it will have a
  3. buffer with 10 strings. When the producer returns from the exchange() method, it will have
  4. an empty buffer to fill again. This operation will be repeated 10 times.
  1. If you execute the example, you will see how producer and consumer do their jobs
  2. concurrently and how the two objects interchange their buffers in every step. As it occurs with
  3. other synchronization utilities, the first thread that calls the exchange() method was put to
  4. sleep until the other threads arrived.

Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型的更多相关文章

  1. JAVA多线程学习八-多个线程之间共享数据的方式

    多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...

  2. Android多线程研究(5)——线程之间共享数据

    一.如果是每个线程都执行相同的代码,则可以使用同一个Runnable来实现共享 public class MultiThreadShareData { public static void main( ...

  3. Java生产者消费者模型

    在Java中线程同步的经典案例,不同线程对同一个对象同时进行多线程操作,为了保持线程安全,数据结果要是我们期望的结果. 生产者-消费者模型可以很好的解释这个现象:对于公共数据data,初始值为0,多个 ...

  4. java多线程:线程间通信——生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库 ...

  5. Java并发工具类(四):线程间交换数据的Exchanger

    简介 Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法 ...

  6. java 线程池、多线程实战(生产者消费者模型,1 vs 10) 附案例源码

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  7. java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法

    在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...

  8. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  9. Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型

    Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...

随机推荐

  1. C 小问题集锦

    摘要:在学习 C 语言编程中遇到的一些容易混淆出错的问题,记录下来备忘. C语言学习 小问题集锦 作者:乌龙哈里 时间:2015-11-24 平台:Window7 64bit,C# :Visual S ...

  2. vue router 只需要这么几步

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. 【.NET】上传文件,生成缩略图

    类名:Upload using System; using System.Collections; using System.ComponentModel; using System.Data; us ...

  4. caffe训练超参数

    错误: caffe % ./build/tools/caffe train -solver models/finetune_flickr_style/solver.prototxt -weights ...

  5. iosTableView 局部全部刷新以及删除编辑操作

    局部刷新方法 添加数据 NSArray *indexPaths = @[ [NSIndexPath indexPathForRow:0 inSection:0], [NSIndexPath index ...

  6. AVFoundation--AVPlayer

    // // AVPlayerNetViewController.m // PodsTest // // Created by ZhuYi on 16/4/29. // Copyright © 2016 ...

  7. 强大DOM选择器querySelector

    今天碰到问题,用了下不经常用的querySelector还不错 querySelector 和 querySelectorAll 的使用非常的简单,就像标题说到的一样,它和 CSS 的写法完全一样,对 ...

  8. 设计模式 单例模式(Singleton) [ 转载2 ]

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

  9. hdu_5832_A water problem(模拟)

    题目链接:hdu_5832_A water problem 这是一个惨痛的教训,想这种这么大的大数肯定就是找个规律模拟一下. 然而我们队还写JAVA,用大数艹了13发罚时,真是TM智障了. #incl ...

  10. JSON.parse()和JSON.stringify()&&traditional(ajax请求)的作用

    parse是一个字符串中解析出json对象,如 var str = '{"name":"haizeiwang"}' 结果: JSON.parse(str) na ...