• LinkedBlockingQueue 注记


    近期看一个音频传输代码时,对方采用了LinkedBlockingQueue为生产者、消费者模式,来支撑读写线程。

    个人感觉非常不错,因此也对这种方式进行总结,并梳理了一个基本的功能框架备用。主要两点:

    1、当对queue采用take操作时,若队列为空则阻塞;

    2、当对queue采用put操作时,若队列为满则阻塞;

    package com.fredric;
    
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.LinkedBlockingQueue;
    
    public class Buffer {
        
        private BlockingQueue<BufferData> queue;
        
        public static class BufferData {
            
            public byte mData[];
            
            public BufferData() {
                mData = new byte[100];    
            }    
        }
        
        public Buffer(int bufferSize) {    
            queue = new LinkedBlockingQueue<BufferData>(bufferSize);      
        }
        
        public BufferData doGet(){
            if(null != queue){
                try {
                    return (BufferData) queue.take();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } 
            return null;
        }
        
        public boolean doPut(BufferData data){
            try {
                queue.put(data);
                return true;
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }        
            return false; 
        }
    }
    package com.fredric;
    
    public class Reader implements Runnable{
        
        Buffer buffer;
        
        public Reader(Buffer buffer){  
            this.buffer = buffer;  
        } 
    
        @Override
        public void run() {
            
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }  
            System.out.println(new String(buffer.doGet().mData) 
                + " " + Thread.currentThread().getName());
        }
    }
    package com.fredric;
    
    import java.util.Date;
    import java.util.concurrent.BlockingQueue;
    
    import com.fredric.Buffer.BufferData;
    
    public class Writer implements Runnable{
        
        Buffer buffer;
        
        public Writer(Buffer buffer){  
            this.buffer = buffer;  
        }
    
        @Override
        public void run() {
            BufferData temp = new BufferData();
            String str = new Date().toString();
            System.arraycopy(str.getBytes(), 0, temp.mData, 0, str.getBytes().length);
            
            if(true == buffer.doPut(temp)){
                System.out.println(" Thread Name: "  + Thread.currentThread().getName()); 
            }
        }
    }
    package com.fredric;
    
    public class App {
    
        public static void main(String[] args){
            
            Buffer buffer = new Buffer(2);
            
            Writer writer = new Writer(buffer);
            Reader reader = new Reader(buffer);
            
            for (int i = 0; i < 5; i++) {  
                new Thread(writer, "writer " + (i + 1)).start();  
      
                new Thread(reader, "reader " + (i + 1)).start();  
            } 
        }
    }
  • 相关阅读:
    【原创】Algorithms:原地归并排序
    Java中相等测试
    测试可变字符序列stringBuilder
    呃。。第一篇随笔。
    hiho兄弟的字典树之争(hiho1014)
    字典树
    最大公约数
    素数
    递归算法1
    logging模块,collections模块,random模块
  • 原文地址:https://www.cnblogs.com/Fredric-2013/p/6605630.html
Copyright © 2020-2023  润新知