令仔学多线程系列(二)----自定义Queue队列

    之前做了一个新的需求,需要从每一次search请求返回中获取相关的数据,然后把这些获取到的数据做异步处理,写入缓存并同步到数据库中。如何做异步在这就想到了用队列的方式来实现,一开始是用的BlockingQueue,一遍从队尾push,另一边从队首取数据。
    但是在这个地方用BlockingQueue的时候就会有点问题,首先是如果不给这个队列设置大小的话,时间长了很可能会吧内存给搞瘫了,但是如果给BlockingQueue设置了大小的话(ps:当时设置的是2000),我们的主流程是search,其他的业务功能的开发不能够影响到search的运行(PS:每个平台对search返回的时间都有限制的),当队列满了之后,再多来的任务就会被挂起,一直等到队列中有空余位置才会被执行。这样的话我们整个的流程就会Down掉。
    所以就自己封装了一个Queue,当队列满了之后,多余的数据就会被扔掉,当然不是所有的业务场景都适合使用。仅供参考借鉴。

    下面是具体的代码:

package com.flight.inter.otaadapter.manage;

import java.util.LinkedList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by ling.zhang on 16/4/26.
 */
public class LocalCacheQueue<T> {
    private Lock lock=new ReentrantLock();
    private int maxSize;
    private int currentSize;
    private int size;
    private LinkedList<T> requestQueue;

    public LocalCacheQueue(int size){
        this.size=size;
        this.maxSize=2*size;
        currentSize=0;
        requestQueue=new LinkedList<>();
    }

    public T pop(){
        try{
            lock.lock();
            T getOne=requestQueue.pop();
            if(getOne!=null){
                currentSize--;
            }
            return getOne;
        }catch (Exception e){
            return null;
        }finally {
            lock.unlock();
        }
    }

    public void push(T one){
        try{
            lock.lock();
            if(currentSize>size)
                ltrim();
            requestQueue.push(one);
            currentSize++;
        }catch (Exception e){
        }finally {
            lock.unlock();
        }
    }

    private void ltrim(){
        int needClearSize=currentSize-size;
        for(int i=0;i<needClearSize;i++){
            try {
                T getOne = requestQueue.removeLast();
                currentSize--;
            }catch (Exception e){

            }
        }
    }

}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值