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++默认是大顶堆,小顶堆有两种声明方法: 1.对于基本类型直接用 priority_queue<int, vector<int>, greater<int> >p ...

  2. 《学习的艺术》 (The Art of Learning)

    这是我本科期间读过的的一本,个人感觉很有价值的书.当时刚刚失恋,正在思考人生,看这本书的时候,收获很多. 划小圈 (Making Smaller Circles)

  3. ajax对文件上传

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

  4. 《JavaScript高级程序设计》读书笔记 ---Function 类型

    说起来ECMAScript 中什么最有意思,我想那莫过于函数了——而有意思的根源,则在于函数实际上是对象.每个函数都是Function 类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对 ...

  5. archive log

    1.查看归档模式 2.查看归档文件所在位置 3.完全恢复和不完全恢复 完全恢复:找到问题产生的时间点,在时间点之后的数据也能同时保留 不完全恢复:只能恢复到产生问题的那个时间点的数据状态. 4.非归档 ...

  6. Counting Stars

    Counting Stars 题目链接:http://acm.xidian.edu.cn/problem.php?id=1177 离线+一维树状数组 一眼扫过去:平面区间求和,1e6的数据范围,这要h ...

  7. 抢红包算法 java

    抢红包的需求分析 抢红包的场景有点像秒杀,但是要比秒杀简单点.因为秒杀通常要和库存相关.而抢红包则可以允许有些红包没有被抢到,因为发红包的人不会有损失,没抢完的钱再退回给发红包的人即可.另外像小米这样 ...

  8. TESTNG重试、截屏、监听

    http://qa.blog.163.com/blog/static/19014700220138585422735/

  9. PAT 乙级 1004. 成绩排名

    读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生 ...

  10. Sass与Compress实战:第八章

    概要:帮助你实现样式表的最佳性能 本章内容: ● 样式表拼接 ● 样式表和资源压缩 ● 减少和并行图片请求的策略 ● 选择器性能和优化策略 1. 测量客户端性能 性能优化的起点和终点都是测量.在第一次 ...