package consumer;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;publicclassConsumerimplementsRunnable{/*
* 用util.concurrent.BlockingQueue溝通生產者和消費者的橋樑
*/
BlockingQueue<String> queue;
String id;@SuppressWarnings("unused")privatevolatileboolean isRunning =true;publicConsumer(BlockingQueue<String> queue, String id){this.queue = queue;this.id = id;}publicvoidstop(){
isRunning =false;}@Overridepublicvoidrun(){
System.out.println("Thread: "+ id +" Consumer thread is running...");boolean isRunning =true;try{while(isRunning){
System.out.println("Thread: "+ id +" fetch data from linkedQueue..."+" queue size: "+ queue.size());/*
* 從隊列裏取出一個元素,2秒超時,如果兩秒之後還沒有東西可以取,則poll返回null
*/
String data = queue.poll(2, TimeUnit.SECONDS);if(null != data){
System.out.println("Thread: "+ id +" has consumed one data from queue: "+ data
+" Queue sise: "+ queue.size());// simulate data consumption
Thread.sleep(1000);}else{
isRunning =false;// 消費者準備退出
System.out.println("Thread: "+ id +" Consumer read queue timeout");}}}catch(InterruptedException e){
e.printStackTrace();
Thread.currentThread().interrupt();}finally{
System.out.println("Thread: "+ id +" consumer thread ends");}}}
生產者
package consumer;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;publicclassProducerimplementsRunnable{
BlockingQueue<String> queue;
String id;publicProducer(BlockingQueue<String> queue, String id){this.queue = queue;this.id = id;}@Overridepublicvoidrun(){
String data = null;try{while(isRunning){
System.out.println("PRODUCER: "+ id +" is running");
Thread.sleep(100);
data ="data:"+ count.incrementAndGet();
System.out.println("Thread: "+ id +" procedued data into queue: "+ data +" ...");if(!queue.offer(data,2, TimeUnit.SECONDS)){
System.out.println("failed to put data into queue: "+ data);}}}catch(InterruptedException e){
e.printStackTrace();
Thread.currentThread().interrupt();}finally{
System.out.println("Thread: "+ id +" quit from producer thread");}}publicvoidstop(){
isRunning =false;}privatevolatileboolean isRunning =true;privatestatic AtomicInteger count =newAtomicInteger();}