zoukankan      html  css  js  c++  java
  • thread safe queue --cruise

    Implement a Queue with pop and push operations using concurrency coding.
    
    

     

    package com.company;
    import java.util.*;
    import java.util.concurrent.locks.*;
    
    class BQueue<T> {
    
         Condition isFullCondition;
         Condition isEmptyCondition;
         Lock lock;
    int limit;
    int cur = 0;
    Queue<T> q = new LinkedList<>();
    
         public BQueue() {
             this(Integer.MAX_VALUE);
         }
    
         public BQueue(int limit) {
             this.limit = limit;
             lock = new ReentrantLock();
             isFullCondition = lock.newCondition();
             isEmptyCondition = lock.newCondition();
         }
    
         public void put (T t) {
             lock.lock();
             try {
                 while (q.size() == limit) {
                     try {
                         isFullCondition.await();
                     } catch (InterruptedException ex) {}
                 }
                 q.add(t);
                 isEmptyCondition.signalAll();
             } finally {
                 lock.unlock();
             }
         }
    
         public T get() {
             T t = null;
             lock.lock();
             try {
                 while (q.size() == 0) {
                     try {
                         isEmptyCondition.await();
                     } catch (InterruptedException ex) {}
                 }
                 t = q.poll();
                 isFullCondition.signalAll();
             } finally {
                 lock.unlock();
             }
             return t;
         }
    }
    
    
    class Producer extends Thread{
    
        private BQueue data;
    
        public Producer(BQueue data, String name) {
            this.data = data;
            this.setName(name);
        }
    
        @Override
        public void run() {
            for (int i=0; i<100 && data.cur < data.limit; i++) {
                data.put(data.cur);
                data.cur++;
                System.out.println(currentThread().getName() + " " + data.cur);
            }
        }
    }
    
    
    class Consumer extends Thread {
    
        private BQueue data;
    
        public Consumer(BQueue data, String name) {
            this.data = data;
            this.setName(name);
        }
    
        @Override
        public void run() {
            for (int i=0; i<data.limit; i++) {
                System.out.println(currentThread().getName()+ " " + i + "   " + data.get());
            }
        }
    }
    
    
    
    
    public class Test {
    
        public static void main (String args[]) {
            BQueue<Integer> data = new BQueue(10);
            new Producer(data, "put---1").start();
            new Producer(data, "put---2").start();
            new Consumer(data, "get---1").start();
            new Consumer(data, "get---2").start();
    
        }
    }
    

      

  • 相关阅读:
    netty源码深度分析
    《深入探索Netty原理及源码分析》文集小结
    Netty 那些事儿 ——— 心跳机制
    CSS实现单行、多行文本溢出显示省略号(…)
    测试
    PHP 二维数组根据某个字段排序
    PHP生成图片验证码、点击切换实例
    正确设置网站title、keywords、description(转载)
    nginx上支持.htaccess伪静态的配置实例
    百度编辑器Ueditor增加字体的修改方法
  • 原文地址:https://www.cnblogs.com/apanda009/p/9841064.html
Copyright © 2011-2022 走看看