Java朝花夕拾-阻塞队列

BlockingQueue 是java.util.current下主要用来控制线程同步的工具,阻塞型队列,有四种实现类:
   1,ArrayBlockingQueue    大小规定,先进先出,采用数组实现
   2,LinkedBlockingQueue   大小不确定,先进先出,采用链表实现
   3,PriorityBlockingQueue  自然排序,或者是构造函数的Comparator决定的顺序
   4,SynchronousQueue      特殊的BlockingQueue 对其操作必须是放和取交替完成的
   

  在实际开发过程中,使用多的一般是LinkedBlockingQueue,其访问和移除操作是在队头进行,添加是在队尾。

  采用两把锁实现,在需要对两把锁同时加锁时,把加锁的顺序与释放的顺序封装成方法,确保所有地方都是一致的。而且获取锁时都是不响应中断的,一直获取直到加锁成功,这就避免了第一把锁加锁成功,而第二把锁加锁失败导致锁不释放的风险。加锁与释放锁的顺序是相反的。

  put() , take(),remove()  这几个实现原理为,加锁后一直put,知道成功,释放锁。

例子:实现生产消费者模型:

   

package demo1;
/**
 * 是java.util.current下主要用来控制线程同步的工具
 */
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
class Producer implements Runnable{
 private BlockingQueue<String> bq;
 public Producer(BlockingQueue<String> bq){
  this.bq=bq;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  try{
   String temp="A product:"+Thread.currentThread().getName();
   System.out.println("I hava made a product:"+Thread.currentThread().getName());
   bq.add(temp);
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 
}
class Consumer implements Runnable{
 private BlockingQueue<String> bq;
 public Consumer(BlockingQueue<String> bq){
  this.bq=bq;
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  try{
   System.out.println("有则take,没有则等待");
   String temp=bq.take();   
   System.out.println(temp);
   System.out.println("若没有不会执行到这");
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 
}
public class BlockingQueueDemo {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  BlockingQueue<String> bq=new LinkedBlockingQueue<>();
  Producer p=new Producer(bq);
  Consumer c=new Consumer(bq);
  for(int i=0;i<10;i++){
   new Thread(p,"producer"+i).start();
   new Thread(c,"consumer"+i).start();
  }
 }
}
原文地址:https://www.cnblogs.com/dengyuanqi/p/6305901.html