生产者与消费者:

  1. /**
  2. * 生产者每次生产10件商品,消费者每次消费1件商品
  3. * 没有商品时生产者生产商品,有商品时消费者消费商品
  4. */
  5. class Producer extends Thread
  6. {
  7. private Cangku ck;
  8. public Producer(Cangku ck)
  9. {
  10. this.ck = ck;
  11. }
  12. public void run()
  13. {
  14. ck.createProduct();
  15. }
  16. }
  17. class Consumer extends Thread
  18. {
  19. private Cangku ck;
  20. public Consumer(Cangku ck)
  21. {
  22. this.ck = ck;
  23. }
  24. public void run()
  25. {
  26. ck.useProduct();// 消费商品
  27. }
  28. }
  29. class Cangku//商品对象会变化,创建一个容器对象,锁住不变
  30. {
  31. public synchronized void useProduct()//通过方法进行封装
  32. {
  33. for (int i = 0; i < 50; i++)
  34. {
  35. if (productSize() > 0)
  36. {
  37. for (int j = 0; j < 10; j++)
  38. {
  39. Product p = removeProduct(0);
  40. System.out.println("消费了" + j + "个产品");
  41. }
  42. }
  43. notify();
  44. try
  45. {
  46. if (i != 49)
  47. {
  48. wait();
  49. }
  50. }
  51. catch (InterruptedException e)
  52. {
  53. e.printStackTrace();
  54. }
  55. }
  56. }
  57. public synchronized void createProduct()
  58. {
  59. for (int i = 0; i < 50; i++)
  60. {
  61. if (productSize() == 0)
  62. {
  63. for (int j = 0; j < 10; j++)
  64. {
  65. addProduct(new Product());
  66. }
  67. System.out.println("生产了十个产品");
  68. notify();
  69. try
  70. {
  71. if (i != 49)
  72. {
  73. wait();
  74. }
  75. }
  76. catch (InterruptedException e)
  77. {
  78. e.printStackTrace();
  79. }
  80. }
  81. }
  82. }
  83. private LinkedList<Product> ppp = new LinkedList<Product>();//创建一个商品类型的容器
  84. public int productSize()
  85. {
  86. return ppp.size();
  87. }
  88. public void addProduct(Product p)
  89. {
  90. if (null != p)
  91. {
  92. ppp.add(p);
  93. }
  94. }
  95. public Product removeProduct(int index)
  96. {
  97. return ppp.remove(index);
  98. }
  99. }
  100. class Product
  101. {
  102. String name = "玩具";
  103. }
  104. public class Test
  105. {
  106. public static void main(String[] args)
  107. {
  108. Cangku ck = new Cangku();
  109. Producer p = new Producer(ck);
  110. Consumer c = new Consumer(ck);
  111. p.start();
  112. c.start();
  113. }
  114. }

重构经过:

1.

  1. /**
  2. * 加油一次20升,每次加完开车10公里
  3. * 开车耗完油,没油时加油,有油时开车
  4. * 双线程循环五十次
  5. */
  6. public class TwoThread
  7. {
  8. public static void main(String[] args)
  9. {
  10. CarOilBox cob = new CarOilBox();
  11. Car c = new Car(cob);
  12. Oil o = new Oil(cob);
  13. c.start();
  14. o.start();
  15. }
  16. }
  17. class Car extends Thread
  18. {
  19. private CarOilBox cob;
  20. public Car(CarOilBox cob)
  21. {
  22. this.cob = cob;
  23. }
  24. @Override
  25. public void run()
  26. {
  27. synchronized (cob)
  28. {
  29. for (int i = 0; i < 50; i++)
  30. {
  31. if (cob.co != null)
  32. {
  33. for (int j = 0; j < 10; j++)
  34. {
  35. cob.co = null;
  36. System.out.println("第" + i + "次开车" + j + "公里");
  37. }
  38. }
  39. cob.notify();
  40. if (i < 49)
  41. {
  42. try
  43. {
  44. cob.wait();
  45. }
  46. catch (InterruptedException e)
  47. {
  48. e.printStackTrace();
  49. }
  50. }
  51. }
  52. }
  53. }
  54. }
  55. class Oil extends Thread
  56. {
  57. private CarOilBox cob;
  58. public Oil(CarOilBox cob)
  59. {
  60. this.cob = cob;
  61. }
  62. @Override
  63. public void run()
  64. {
  65. synchronized (cob)
  66. {
  67. for (int i = 0; i < 50; i++)
  68. {
  69. if (cob.co == null)
  70. {
  71. for (int j = 0; j < 20; j++)
  72. {
  73. cob.co = new CarOil();
  74. System.out.println("第" + i + "次加油" + j + "升");
  75. }
  76. }
  77. cob.notify();
  78. if (i < 49)
  79. {
  80. try
  81. {
  82. cob.wait();
  83. }
  84. catch (InterruptedException e)
  85. {
  86. e.printStackTrace();
  87. }
  88. }
  89. }
  90. }
  91. }
  92. }
  93. class CarOil
  94. {
  95. }
  96. class CarOilBox
  97. {
  98. CarOil co;
  99. }

2.

  1. public class CopyTwoThread
  2. {
  3. public static void main(String[] args)
  4. {
  5. CarOilBox cob = new CarOilBox();
  6. Car c = new Car(cob);
  7. Oil o = new Oil(cob);
  8. c.start();
  9. o.start();
  10. }
  11. }
  12. class Car extends Thread
  13. {
  14. private CarOilBox cob;
  15. public Car(CarOilBox cob)
  16. {
  17. this.cob = cob;
  18. }
  19. @Override
  20. public void run()
  21. {
  22. synchronized (cob)
  23. {
  24. for (int i = 0; i < 50; i++)
  25. {
  26. if (cob.aco.size() != 0)
  27. {
  28. for (int j = 0; j < 10; j++)
  29. {
  30. CarOil co1 = cob.aco.remove(0);
  31. CarOil co2 = cob.aco.remove(0);
  32. System.out.println("第" + i + "次开车" + j + "公里");
  33. }
  34. }
  35. cob.notify();
  36. if (i < 49)
  37. {
  38. try
  39. {
  40. cob.wait();
  41. }
  42. catch (InterruptedException e)
  43. {
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  48. }
  49. }
  50. }
  51. class Oil extends Thread
  52. {
  53. private CarOilBox cob;
  54. public Oil(CarOilBox cob)
  55. {
  56. this.cob = cob;
  57. }
  58. @Override
  59. public void run()
  60. {
  61. synchronized (cob)
  62. {
  63. for (int i = 0; i < 50; i++)
  64. {
  65. if (cob.aco.size() == 0)
  66. {
  67. for (int j = 0; j < 20; j++)
  68. {
  69. cob.aco.add(new CarOil());
  70. System.out.println("第" + i + "次加油" + j + "升");
  71. }
  72. }
  73. cob.notify();
  74. if (i < 49)
  75. {
  76. try
  77. {
  78. cob.wait();
  79. }
  80. catch (InterruptedException e)
  81. {
  82. e.printStackTrace();
  83. }
  84. }
  85. }
  86. }
  87. }
  88. }
  89. class CarOil
  90. {
  91. }
  92. class CarOilBox
  93. {
  94. CarOil co;
  95. ArrayList<CarOil> aco =new ArrayList<CarOil>();
  96. }

3.

  1. public class CopyTwoThread
  2. {
  3. public static void main(String[] args)
  4. {
  5. CarOilBox cob = new CarOilBox();
  6. Car c = new Car(cob);
  7. Oil o = new Oil(cob);
  8. c.start();
  9. o.start();
  10. }
  11. }
  12. class Car extends Thread
  13. {
  14. private CarOilBox cob;
  15. public Car(CarOilBox cob)
  16. {
  17. this.cob = cob;
  18. }
  19. @Override
  20. public void run()
  21. {
  22. synchronized (cob)
  23. {
  24. for (int i = 0; i < 50; i++)
  25. {
  26. if (cob.arraySize() != 0)
  27. {
  28. for (int j = 0; j < 10; j++)
  29. {
  30. CarOil co1 = cob.arrayRemove();
  31. CarOil co2 = cob.arrayRemove();
  32. System.out.println("第" + i + "次开车" + j + "公里");
  33. }
  34. }
  35. cob.notify();
  36. if (i < 49)
  37. {
  38. try
  39. {
  40. cob.wait();
  41. }
  42. catch (InterruptedException e)
  43. {
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  48. }
  49. }
  50. }
  51. class Oil extends Thread
  52. {
  53. private CarOilBox cob;
  54. public Oil(CarOilBox cob)
  55. {
  56. this.cob = cob;
  57. }
  58. @Override
  59. public void run()
  60. {
  61. synchronized (cob)
  62. {
  63. for (int i = 0; i < 50; i++)
  64. {
  65. if (cob.arraySize() == 0)
  66. {
  67. for (int j = 0; j < 20; j++)
  68. {
  69. cob.arrayAdd();
  70. System.out.println("第" + i + "次加油" + j + "升");
  71. }
  72. }
  73. cob.notify();
  74. if (i < 49)
  75. {
  76. try
  77. {
  78. cob.wait();
  79. }
  80. catch (InterruptedException e)
  81. {
  82. e.printStackTrace();
  83. }
  84. }
  85. }
  86. }
  87. }
  88. }
  89. class CarOil
  90. {
  91. }
  92. class CarOilBox
  93. {
  94. //CarOil co;
  95. private ArrayList<CarOil> aco =new ArrayList<CarOil>();
  96. public int arraySize()
  97. {
  98. return aco.size();
  99. }
  100. public CarOil arrayRemove()
  101. {
  102. return aco.remove(0);
  103. }
  104. public void arrayAdd()
  105. {
  106. aco.add(new CarOil());
  107. }
  108. }

4.

  1. public class CopyTwoThread
  2. {
  3. public static void main(String[] args)
  4. {
  5. CarOilBox cob = new CarOilBox();
  6. Car c = new Car(cob);
  7. Oil o = new Oil(cob);
  8. c.start();
  9. o.start();
  10. }
  11. }
  12. class Car extends Thread
  13. {
  14. private CarOilBox cob;
  15. public Car(CarOilBox cob)
  16. {
  17. this.cob = cob;
  18. }
  19. @Override
  20. public void run()
  21. {
  22. cob.driveCar(cob);
  23. }
  24. }
  25. class Oil extends Thread
  26. {
  27. private CarOilBox cob;
  28. public Oil(CarOilBox cob)
  29. {
  30. this.cob = cob;
  31. }
  32. @Override
  33. public void run()
  34. {
  35. cob.addOil(cob);
  36. }
  37. }
  38. class CarOil
  39. {
  40. }
  41. class CarOilBox
  42. {
  43. //CarOil co;
  44. private ArrayList<CarOil> aco =new ArrayList<CarOil>();
  45. public int arraySize()
  46. {
  47. return aco.size();
  48. }
  49. public CarOil arrayRemove()
  50. {
  51. return aco.remove(0);
  52. }
  53. public void arrayAdd()
  54. {
  55. aco.add(new CarOil());
  56. }
  57. public synchronized void driveCar(CarOilBox cob)
  58. {
  59. for (int i = 0; i < 50; i++)
  60. {
  61. if (arraySize() != 0)
  62. {
  63. for (int j = 0; j < 10; j++)
  64. {
  65. CarOil co1 = arrayRemove();
  66. CarOil co2 = arrayRemove();
  67. System.out.println("第" + i + "次开车" + j + "公里");
  68. }
  69. }
  70. notify();
  71. if (i < 49)
  72. {
  73. try
  74. {
  75. wait();
  76. }
  77. catch (InterruptedException e)
  78. {
  79. e.printStackTrace();
  80. }
  81. }
  82. }
  83. }
  84. public synchronized void addOil(CarOilBox cob)
  85. {
  86. for (int i = 0; i < 50; i++)
  87. {
  88. if (arraySize() == 0)
  89. {
  90. for (int j = 0; j < 20; j++)
  91. {
  92. arrayAdd();
  93. System.out.println("第" + i + "次加油" + j + "升");
  94. }
  95. }
  96. notify();
  97. if (i < 49)
  98. {
  99. try
  100. {
  101. wait();
  102. }
  103. catch (InterruptedException e)
  104. {
  105. e.printStackTrace();
  106. }
  107. }
  108. }
  109. }
  110. }
本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1195004,如需转载请自行联系原作者

线程:生产者与消费者模式相关推荐

  1. 线程间的协作(2)——生产者与消费者模式

    2019独角兽企业重金招聘Python工程师标准>>> 1.何为生产者与消费者 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程. import java.util. ...

  2. 用生产者和消费者模式实现奇数偶数不同线程交替输出

    要求 使用生产者和消费者模式实现,交替输出: 假设只有两个线程,输出以下结果:t1-->1t2-->2t1-->3t2-->4t1-->5t2-->6....要求: ...

  3. 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)

    线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...

  4. Python中的生产者与消费者模式(转载)

    利用多线程和队列可以实现生产者消费者模式.该模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度. 1.什么是生产者和消费者? 在线程世界里,生产者就是生产数据(或者说发布任务)的线程 ...

  5. 生产者、消费者模式实现

    1.1生产和1消费 一个String对象,生产者设定值,消费者拿走值. wait()/notify()实现 生产者 public class Product {private String lock; ...

  6. Java多线模式-Producer-Consumer模式(生产者、消费者模式)

    1.场景 有些时候需要两个或两个以上的线程协同工作,每个线程需要使用其他线程产生数据. 2.详细说明 可以把上面的场景抽象成生产者和消费者模式.从消费者的角度:消费者需要消费生产者生成的产品. 从生产 ...

  7. 多线程通信—生产者和消费者模式

    1.队列Queue: 从一个线程向另一个线程发送数据最安全的方式可能就是使用queue库中的队列了.创建一个被多个线程共享的Queue对象,这些线程通过使用put()和get()操作来向队列中添加或者 ...

  8. python 生产者和消费者模式_Python爬虫:生产者和消费者模式

    认识生产者和消费者模式 生产者和消费者是多线程中很常见的一个问题.产生数据的模块,我们称之为生产者,而处理数据的模块,就称为消费者.但是单单只有生产者和消费者显然还是不够的,一般来说,我们还有一个缓冲 ...

  9. python 多线程并发编程(生产者、消费者模式),边读图像,边处理图像,处理完后保存图像实现提高处理效率

    文章目录 需求 实现 先导入本次需要用到的包 一些辅助函数 如下函数是得到指定后缀的文件 如下的函数一个是读图像,一个是把RGB转成BGR 下面是主要的几个处理函数 在上面几个函数构建对应的处理函数 ...

  10. python中的生产者与消费者模式

    Queue的说明 对于Queue,在多线程通信之间扮演重要的角色 添加数据到队列中,使用put()方法 从队列中取数据,使用get()方法 判断队列中是否还有数据,使用qsize()方法 生产者消费者 ...

最新文章

  1. 博士申请 | 日内瓦大学招收机器学习和计算机视觉博士生(年薪35万)
  2. 预处理_不锈钢锻件预处理的必要性
  3. 光在介质中传播速度—材料折射率变化—物理光学记录
  4. 【十问十答】粒子群算法(PSO)
  5. python语言程序设计实践教程答案实验六_20192417 实验一《Python程序设计》实验报告...
  6. 【剑指offer】_01 (二维数组中的查找)
  7. PHP定时抽奖怎么实现的,定时抽奖活动怎么做?
  8. fastText原理和文本分类实战,看这一篇就够了
  9. 数据库mysql去重_MySQL数据库去重 SQL解决
  10. matplotlib之hist
  11. OSPF实验———Secondary Address
  12. 《互联网信贷风险与大数据》读书笔记(四)
  13. 欧盟授权代表EU Representative是什么?
  14. OpenWrt-路由器上的linux
  15. 【LeetCode】643. 子数组最大平均数 I
  16. ios 开发 怎样在项目中使用除系统外的字体
  17. python 正态分布图_用python制作正态分布图
  18. 加西亚·马尔克斯致读者《告别信》来源:infzm.com
  19. 如何把魅族Pro 5刷成Ubuntu手机
  20. matlab制作圆摆线动画

热门文章

  1. eBPF-3-profile的源码解析
  2. service mysqld stop 无法 停止 myql
  3. 山东大学大数据管理与分析知识点总结
  4. Developing Excel Utilities with VBA
  5. Android Framework——zygote 启动 SystemServer
  6. HubSpoke 实验
  7. The main roles of LTE eNodeB.
  8. 教育部调整台湾高中毕业生凭学测成绩申请大陆高校标准
  9. SAP Field Service Management 和微信集成的案例分享和实现介绍
  10. php 商城运费计算,ecshop商城运费计算移植到app