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