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