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();}