生产者消费者模式

来源:互联网 发布:淘宝展现量是什么意思 编辑:程序博客网 时间:2024/06/14 02:25
方法一:   wait()  和   notify()   通信方法实现

1.通过对象锁实现公共容器的同步,即一次只能有一个生产者往容器放产品或是一个消费者取出产品
  1. package Consumerproducer;
  2. public class PublicContainer{
  3. int capaticy=10;
  4. public synchronized void decreate(String name){
  5. while(capaticy==0){
  6. try {
  7. this.wait();
  8. } catch (InterruptedException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. capaticy--;
  13. System.out.println(name+"\n生产成功,容量还有"+capaticy);
  14. this.notify();
  15. }
  16. public synchronized void increate(String name){
  17. while(capaticy==10){
  18. try {
  19. this.wait();
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. capaticy++;
  25. System.out.println(name+"\n消费成功,容量还有"+capaticy);
  26. this.notify();
  27. }
  28. public static void main(String[] args) {
  29. // TODO Auto-generated method stub
  30. PublicContainer publicContainer=new PublicContainer();
  31. Consumer consumer1=new Consumer("consumer1", publicContainer);
  32. Consumer consumer2=new Consumer("consumer2", publicContainer);
  33. Consumer consumer3=new Consumer("consumer3", publicContainer);
  34. Thread c1=new Thread(consumer1);
  35. Thread c2=new Thread(consumer2);
  36. Thread c3=new Thread(consumer3);
  37. Producer producer1=new Producer("producer1", publicContainer);
  38. Producer producer2=new Producer("producer2", publicContainer);
  39. Thread p1=new Thread(producer1);
  40. Thread p2=new Thread(producer2);
  41. c1.start();
  42. c2.start();
  43. c3.start();
  44. p1.start();
  45. p2.start();
  46. }
  47. }
  48. class Consumer implements Runnable{
  49. private String name;
  50. PublicContainer publicContainer;
  51. public Consumer(String name,PublicContainer publicContainer) {
  52. this.name=name;
  53. this.publicContainer=publicContainer;
  54. }
  55. @Override
  56. public void run() {
  57. while(true){
  58. try {
  59. Thread.sleep(1500);
  60. publicContainer.increate(name);
  61. } catch (InterruptedException e) {
  62. // TODO Auto-generated catch block
  63. e.printStackTrace();
  64. }
  65. }
  66. }
  67. }
  68. class Producer implements Runnable{
  69. private String name;
  70. PublicContainer publicContainer;
  71. public Producer(String name,PublicContainer publicContainer){
  72. this.name=name;
  73. this.publicContainer=publicContainer;
  74. }
  75. @Override
  76. public void run() {
  77. while(true){
  78. try {
  79. Thread.sleep(1000);
  80. publicContainer.decreate(name);
  81. } catch (InterruptedException e) {
  82. // TODO Auto-generated catch block
  83. e.printStackTrace();
  84. }
  85. }
  86. }
  87. }

方法二:采用阻塞队列实现生产者消费者模式
1.通过阻塞队列来实现同步,java.util.concurrent中的容器是线程安全的
  1. package Consumerproducer;
  2. import java.util.concurrent.BlockingQueue;
  3. import java.util.concurrent.LinkedBlockingQueue;
  4. public class PublicBoxQueue {
  5. public static void main(String[] args) {
  6. // TODO Auto-generated method stub
  7. BlockingQueue publicBoxQueue= new LinkedBlockingQueue(5);
  8. Consumer2 c1=new Consumer2(publicBoxQueue);
  9. Consumer2 c2=new Consumer2(publicBoxQueue);
  10. Producer2 p1=new Producer2(publicBoxQueue);
  11. Thread t1=new Thread(c1);
  12. Thread t2=new Thread(c2);
  13. Thread t3=new Thread(p1);
  14. t1.start();
  15. t2.start();
  16. t3.start();
  17. }
  18. }
  19. class Consumer2 implements Runnable{
  20. private final BlockingQueue publicBoxQueue;
  21. public Consumer2(BlockingQueue publicBoxQueue){
  22. this.publicBoxQueue=publicBoxQueue;
  23. }
  24. @Override
  25. public void run() {
  26. // TODO Auto-generated method stub
  27. int i=0;
  28. while(true){
  29. try {
  30. Thread.sleep(1500);
  31. System.out.println("消费者消费的苹果编号为 :"+publicBoxQueue.take());
  32. } catch (InterruptedException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. }
  36. }
  37. }
  38. }
  39. class Producer2 implements Runnable{
  40. private final BlockingQueue publicBoxQueue;
  41. public Producer2(BlockingQueue publicBoxQueue){
  42. this.publicBoxQueue=publicBoxQueue;
  43. }
  44. @Override
  45. public void run() {
  46. // TODO Auto-generated method stub
  47. int i=0;
  48. while(true){
  49. i++;
  50. try {
  51. Thread.sleep(500);
  52. publicBoxQueue.put(i);
  53. System.out.println("生产者的生产苹果编号为:"+i);
  54. } catch (InterruptedException e) {
  55. // TODO Auto-generated catch block
  56. e.printStackTrace();
  57. }
  58. }
  59. }
  60. }

原创粉丝点击