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

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

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;  } this

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



 生产者代码 code

/**
 * 生产者
 * @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 我是生产者我准备生产

相关文章
相关标签/搜索