学习
实践
活动
专区
工具
TVP
写文章
专栏首页令仔很忙令仔学多线程系列(二)----自定义Queue队列

令仔学多线程系列(二)----自定义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){

            }
        }
    }

}
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/zlts000复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 令仔学多线程系列(三)----每天定点执行指定任务

    需要注意的一个地方,就是在AirChangeTimerManage 类中,我是每天4点定时执行任务,但是如果我在4点之后进行了重启或者发布,启动之后这个任务就...

    令仔很忙
  • 一文详解「队列」,手撸队列的3种方法!

    前面我们介绍了栈(Stack),队列和栈是比较像的一种数据结构。我们可以想象有很多辆汽车正在通过单行道的隧道,所有车辆不能插队、不能掉头,先进来的车也先出去,我...

    Java中文社群-磊哥
  • iOS多线程——你要知道的NSOperation都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里

    你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里 转载请注明出处 https://cloud.tencent.co...

    WWWWDotPNG
  • 腾讯云消息队列TDMQ RabbitMQ 版开启公测,文末有惊喜!

    导语 1月6日,TDMQ RabbitMQ 版正式公测!TDMQ RabbitMQ 版是TDMQ系列产品中的一款子产品,是一款分布式高可用的消息队列服务,支持A...

    腾讯云中间件团队
  • 用生产者消费者模式爬取斗图吧,一次性收获超多表情包【python爬虫入门进阶】(11)

    前两篇文章我们分别介绍了 用正则表达式爬取古诗文网站,边玩边学【python爬虫入门进阶】(09) CSV文件操作起来还挺方便的【python爬虫入门进阶】(1...

    码农飞哥
  • Python:线程、进程与协程(7)——

         前面转载了一篇分析进程池源码的博文,是一篇分析进程池很全面的文章,点击此处可以阅读。在Python中还有一个线程池的概念,它也有并发处理能力,在一定程...

    py3study
  • Python多线程学习教程

    首先我们来解释一下多线程:多线程我们可以理解为多个进程/多个程序同时运行,多线程最大的好处就是帮助我们提高效率,平常我们1小时完成的任务,通过多线程10分钟就可...

    K同学啊
  • iOS-多线程详解

    xx_Cc
  • 常见的计算机专业词汇

       作为计算机相关专业学生,面试或者笔试时不可避免地会遇到与专业相关的问题,而考核专业问题的时候,又不可避免地涉及到很多专业词汇,这就需要求职者掌握好常见的...

    bear_fish
  • iOS多线程——你要知道的GCD都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里

    你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里 转载请注明出处 https://cloud.tencent.co...

    WWWWDotPNG
  • iOS多线程:『NSOperation、NSOperationQueue』详尽总结

    程序员充电站
  • iOS多线程编程之三——GCD的应用 原

    在软件开发中使用多线程可以大大的提升用户体验度,增加工作效率。iOS系统中提供了多种分线程编程的方法,在前两篇博客都有提及:

    珲少
  • java高并发系列 - 第25天:掌握JUC中的阻塞队列

    (2)如果操作失败,则返回特殊值(null或false,具体取决于操作),接口的常规结构如下表所示。

    路人甲Java
  • Java 多线程(6)----线程池(上)

    在前面的系列文章中,我们介绍了一下 Java 中多线程的一些主要的知识点和多线程并发程序的设计和处理思想。包括线程的介绍、生命周期、线程的运行控制。之后介绍了如...

    指点
  • GCD概念和基本使用GCD概念和基本使用

    总体来说涉及到串行队列的嵌套就容易出现死锁,使用时一定要注意;串行队列里添加同步任务队列必定会出现死锁;

    用户8893176
  • 推荐:多线程的实现方式及经典示例

    iOS中实现多线程的技术方案 ? pthread 实现多线程操作 代码实现: void * run(void *param) { for (NSInte...

    春哥大魔王
  • iOS - 多线程(四):NSOperation

    NSOperation 需要和 NSOperationQueue 配合使用来实现多线程方案。单独使用 NSOperation 的话, 它是属于同步操作, 并不具...

    师大小海腾
  • 多线程必考的「生产者 - 消费者」模型,看乔戈里这篇文章就够了

    生产者 - 消费者模型 Producer-consumer problem 是一个非常经典的多线程并发协作的模型,在分布式系统里非常常见。也是面试中无论中美大厂...

    乔戈里
  • iOS多线程开发之深入GCD 原

            在以前的一些系列博客中,对iOS中线程的管理做了总结,其中涵盖了GCD的相关基础知识:http://my.oschina.net/u/23408...

    珲少

扫码关注腾讯云开发者

领取腾讯云代金券