天天看點

設計模式學習之-生産者與消費者模式 原

别人說的幾句廢話,拿來充充場面,哈哈,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

我是生産者我準備生産