专栏首页令仔很忙令仔学多线程系列(二)----自定义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){

            }
        }
    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

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

    令仔很忙
  • iOS多线程编程

    王大锤
  • iOS多线程编程

    王大锤
  • yeoman-generator 中的 run loop 实现

    yeoman genenrator 的 run loop,每一个添加进去的方法都会在 generator 调用的时候被调用,而且通常来讲,这些方法是按照顺序调用...

    腾讯IVWEB团队
  • 解读 Java 并发队列 BlockingQueue

    原文出处:https://javadoop.com/post/java-concurrent-queue

    Java
  • 《Objective-C-高级编程》干货三部曲(三):GCD篇

    我们知道在iOS开发中,一共有四种多线程技术:pthread,NSThread,GCD,NSOperation:

    用户1740424
  • python爬虫 | 一文搞懂分布式进程爬虫

    今天咱们来扯一扯分布式进程爬虫,对爬虫有所了解的都知道分布式爬虫这个东东,今天我们来搞懂一下分布式这个概念,从字面上看就是分开来布置,确实如此它是可以分开来运...

    Python数据科学
  • 解读 Java 并发队列 BlockingQueue

    转自:https://javadoop.com/post/java-concurrent-queue

    Java技术江湖
  • 面试官:线程池如何按照core、max、queue的执行循序去执行?(内附详细解析)

    前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core、max、queue的执行循序去执行?"。

    一枝花算不算浪漫
  • 【刘文彬】 Debug EOS:nodeos + mongo_db_plugin

    原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/storage.html

    圆方圆学院
  • python爬虫 | 一文搞懂分布式进程爬虫

    今天咱们来扯一扯分布式进程爬虫,对爬虫有所了解的都知道分布式爬虫这个东东,今天我们来搞懂一下分布式这个概念,从字面上看就是分开来布置,确实如此它是可以分开来运...

    Python进击者
  • Debug EOS:nodeos + mongo_db_plugin

    nodeos开始运行前,要先使用项目的总CmakeList.txt配置,这里我配置了boost库的位置,如果你配置了boost的环境变量可以跳过这里。

    文彬
  • 万类之父——Object

      Object类作为Java中的顶级类,位于java.lang包中。所有的类直接或者间接都继承自它。所以Object类中的方法在所有类中都可以直接调用。在深入...

    用户1148394
  • 记一次惊心的网站 TCP 队列问题排查经历

    小小科
  • IBM WebSphere MQ 系列(一)基础知识

    Java学习123
  • rabbitmq 原理、集群、基本运维操作、常见故障处理

    本次学习主要针对运维人员,和对rabbitmq不熟悉的开发人员。通过本次学习你将掌握rabbitmq 的基本原理、集群、基本运维操作、常见故障处理

    机智的程序员小熊
  • RabbitMQ原理、集群、基本操作及常见故障处理

    本次学习主要针对运维人员,和对rabbitmq不熟悉的开发人员。通过本次学习你将掌握rabbitmq 的基本原理、集群、基本运维操作、常见故障处理。

    猿哥
  • python爬虫入门八:多进程/多线程

    但如果数据量很大,比如要通过访问数百数千个url去爬取数据,单线程必须等待当前url访问完毕并且数据提取保存完成后才可以对下一个url进行操作,一次只能对一个u...

    py3study
  • 走进 JDK 之 PriorityQueue

    这是 Java 集合框架的第三篇文章了,前两篇分别解析了 ArrayList 和 LinkedList,它们分别是基于动态数组和链表来实现的。今天来说说 Jav...

    路遥TM

扫码关注云+社区

领取腾讯云代金券