• 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();
      }
     }
    }
  • 相关阅读:
    1856: [Scoi2010]字符串(Catalan数)
    11.6NOIP模拟赛
    bzoj1257[CQOI2007]余数之和(除法分块)
    11.5NOIP模拟赛
    bzoj1048(记忆化搜索)
    置顶公告+更新日志
    CF585F Digits of Number Pi
    [SHOI2007]善意的投票
    [HEOI2015]最短不公共子串
    树形背包复杂度+P3177 [HAOI2015]树上染色
  • 原文地址:https://www.cnblogs.com/dengyuanqi/p/6305901.html
Copyright © 2020-2023  润新知