生产者--消费者问题

 自己在网上搜集了一些资料,然后又根据自己的理解写的,如果有问题,请指出,我将改正

 

 

 

Java代码 复制代码 收藏代码
  1. package cn.henu.sjg.producerAndConsumer;
  2.  
  3. import java.util.LinkedList;
  4. import java.util.Scanner;
  5.  
  6. /**
  7. * 生产者--消费者问题
  8. * @author Shang Jianguo
  9. * @2012-12-10 下午9:42:17
  10. */
  11. public class ProducerAndConsumer {
  12. private LinkedList<Object> container = new LinkedList<Object>(); // 作为缓冲区
  13. private int MAX = 10; // 缓冲区中商品的最多数量
  14. private boolean isEmpty = true;// 标志缓冲区是否为空
  15.  
  16. public static void main(String[] args) {
  17.  
  18. Scanner sc = new Scanner(System.in);
  19. System.out.println("请输入生产者数目:");
  20. int pnum = sc.nextInt();
  21. System.out.println("请输入消费者数目:");
  22. int cnum = sc.nextInt();
  23.  
  24. ProducerAndConsumer pac = new ProducerAndConsumer();
  25. for(int i=0;i<pnum;i++){
  26. pac.new Producer("生产者" + i).start();
  27. }
  28. for(int i=0;i<cnum;i++){
  29. pac.new Consumer("消费者" + i).start();
  30. }
  31. }
  32.  
  33.  
  34. /**
  35. * 生产者类
  36. * @author Shang Jianguo
  37. * @2012-12-10 下午9:42:36
  38. */
  39. class Producer extends Thread {
  40.  
  41. public Producer(String name) {
  42. super(name);
  43. }
  44.  
  45. @Override
  46. public void run() {
  47. while (true) {
  48. synchronized (container) {
  49. if (isEmpty) {// 缓冲区为空并且没有生产
  50. if (MAX > container.size()) {// 向缓冲区中添加商品
  51. container.add("产品" + container.size());
  52. System.out.println(getName() + "生产了产品--" + container.getLast() );
  53. }
  54.  
  55. isEmpty = false;
  56. container.notifyAll();
  57. } else {
  58. try {// 没有产品,线程等待
  59. container.notifyAll();
  60. container.wait();
  61. } catch (InterruptedException e) {
  62. e.printStackTrace();
  63. }
  64. }
  65. }
  66. }
  67. }
  68. }
  69.  
  70. /**
  71. * 消费者类
  72. * @author shangjianguo
  73. */
  74. class Consumer extends Thread {
  75. public Consumer(String name) {
  76. super(name);
  77. }
  78.  
  79. @Override
  80. public void run() {
  81. while (true) {
  82.  
  83. synchronized (container) {
  84. try {
  85. container.wait(1000);
  86. } catch (InterruptedException e1) {
  87. e1.printStackTrace();
  88. }
  89. if (!isEmpty) {// 有商品
  90. Object good = container.removeLast();
  91. System.out.println(getName() + " 消费了商品:" + good);
  92. if (container.isEmpty()) {// 没有商品了
  93. isEmpty = true;
  94. }
  95. container.notifyAll();
  96. } else {
  97. System.out.println(getName() + ":没有商品了!");
  98. try {
  99. container.wait();
  100. } catch (InterruptedException e) {
  101. e.printStackTrace();
  102. }
  103. }
  104. try {
  105. sleep(1000);
  106. } catch (InterruptedException e2) {
  107. e2.printStackTrace();
  108. }
  109. container.notifyAll();
  110. }
  111. }
  112. }
  113.  
  114. }
  115. }  

你可能感兴趣的:(生产者,消费者)