【多线程】----自定义Queue队列

2017-01-13 15:07:07来源:csdn作者:u010853701人点击

之前做了一个新的需求,需要从每一次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){}
}
}}

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台