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

      

  • 相关阅读:
    wifi热点
    【WIN7】windowssystem32 下的几乎所有文件的简单说明【2】
    clipbrd剪切板查看器
    【WIN7】windowssystem32 下的几乎所有文件的简单说明【1】
    Host
    ReadyBoost
    在U盘上安装Damn Small Linux
    readonly、disabled、display、visible的区别
    VS2010中安装AjaxControlToolkit
    读取文件夹列表、删除文件夹及文件夹中的内容
  • 原文地址:https://www.cnblogs.com/apanda009/p/9841064.html
Copyright © 2011-2022 走看看