设计模式学习之-生产者与消费者模式

别人说的几句废话,拿来充充场面,哈哈,Java 5之前实现同步存取时,可以使用普通的一个集合,然后在使用线程的协作和线程同步可以实现生产者,消费者模式,主要的技术就是用好,wait ,notify,notifyAll,sychronized这些关键字。而在java 5之后,可以使用组阻塞队列来实现,此方式大大简少了代码量,使得多线程编程更加容易,安全方面也有保障。

BlockingQueue接口是Queue的子接口,它的主要用途并不是作为容器,而是作为线程同步的的工具,因此他具有一个很明显的特性,当生产者线程试图向BlockingQueue放入元素时,如果队列已满,则线程被阻塞,当消...

消费者代码

import java.util.concurrent.BlockingQueue;

/**  * 消费者  *  * @author lianghao  *  */ public class Consumer extends Thread {  private BlockingQueue<Integer> bq;

 public Consumer(BlockingQueue bq) {   this.bq = bq;  }

 /**   * 业务执行方法   */  public void run() {   while (true) {    System.out.println("我消费了一个" + bq.poll());    try {     Thread.sleep(1000);    } catch (InterruptedException e) {     e.printStackTrace();    }   }  } }



 生产者代码

/**
 * 生产者
 * @author lianghao
 *
 */
public class Producer extends Thread{
  private BlockingQueue<Integer> bq; 
  public Producer(BlockingQueue bq) {
   this.bq = bq;
  }
  /**
   * 业务执行方法
   */
  public void run() {
   for(int i=0;i<100;i++){
    System.out.println("我是生产者我准备生产");
    bq.add(i);
    System.out.println("我生产了一个"+i);
    try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
   } }
}

测式代码

public class MainTest {
  public static void main(String[] args) {
	  BlockingQueue<Integer> bq = new ArrayBlockingQueue<>(100);
	  new Producer(bq).start();
	  new Consumer(bq).start();
}
}

运行结果如下

我是生产者我准备生产
我消费了一个null
我生产了一个0
我是生产者我准备生产
我消费了一个0
我生产了一个1
我是生产者我准备生产
我消费了一个1
我生产了一个2
我是生产者我准备生产
我消费了一个2
我生产了一个3
我是生产者我准备生产
我消费了一个3
我生产了一个4
我是生产者我准备生产
我消费了一个4
我生产了一个5
我是生产者我准备生产
我消费了一个5
我生产了一个6
我是生产者我准备生产
我消费了一个6
我生产了一个7
我是生产者我准备生产


 


 

你可能感兴趣的:(设计模式学习之-生产者与消费者模式)