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

別人說的幾句廢話,拿來充充場面,哈哈,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 我是生產者我準備生產

相關文章
相關標籤/搜索