利用阻塞队列实现生产者、消费者模型的实例

package com.etc.test;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
 * 利用阻塞队列实现生产者、消费者模型的实例
 * @author xiangrian
 */
public class TestBlockingQueue {
//设置缓冲区最多可存放3个数据
final static BlockingQueue bliocking=new ArrayBlockingQueue(3);
  public static void main(String[] args) {
  for(int i=1;i<=2;i++){//启动两个存放数据的线程,使用阻塞队列的作用更明显
  putdata pd=new putdata(); 
  pd.start();
  }   
  takedata ta=new takedata();
  ta.start();

}
}
    //定义一个线程实现不停往缓冲区存放数据(相当于生产者)
    class putdata extends Thread{
    public void run() {
    while(true){
       try {
    Thread.sleep((long) (Math.random() * 1000));
System.out.println(Thread.currentThread().getName()+"正准备存放数据"+(TestBlockingQueue.bliocking.size()== 3 ?"队列容量已满,正在等待" : "……"));
TestBlockingQueue.bliocking.put("数据");
System.out.println(Thread.currentThread().getName()
+ "存入数据," + "队列目前有" + TestBlockingQueue.bliocking.size()
+ "个数据");
       } catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
       
    }
    }
  }
    
    //定义一个线程实现不停的往缓冲区取出数据(相当于消费者)
    class takedata extends Thread{
    public void run() {
    while(true){
    try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"正准备取出数据"+(TestBlockingQueue.bliocking.size()==0?"队列容量为空,正在等待":"……"));
TestBlockingQueue.bliocking.take();
System.out.println(Thread.currentThread().getName()
+ "存入数据," + "队列目前有" + TestBlockingQueue.bliocking.size()
+ "个数据");
    } catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    }
    }
    }

    

效果显示:

利用阻塞队列实现生产者、消费者模型的实例_第1张图片

你可能感兴趣的:(案例)