小工具实现

public abstract class AbsBatchProcess<T> implements Runnable {

    // 记录条数

    protected int recordNum;

    // 空闲时间(ms)

    protected long idleTime;

    // 轮询间隔

    protected long interval;

    // 是否停止

    private boolean stop;

    // 数据

    private Queue<T> data;

    // 上次时间(ms)

    private long lastTime;

    // 监听

    private SecScanf scanf;

    

    public AbsBatchProcess() {

        recordNum = 10;

        idleTime = 5000;

        interval = 1000;

        stop = false;

        data = new ConcurrentLinkedQueue<T>();

        lastTime = System.currentTimeMillis();

        scanf = new SecScanf();

    }

    

    /**

     * 开始

     */

    public final void start(){

        stop = false;

        scanf.stop = false;

        new Thread(this).start();

        new Thread(scanf).start();

    }

    

    /**

     * 终止

     */

    public final void stop(){

        stop = true;

        scanf.stop = true;

    }

    

    

    /* (non-Javadoc)

     * @see java.lang.Runnable#run()

     */

    @Override

    public final void run() {

        while(!stop){

            synchronized (data) {

                if(data.size() <= 0){

                    try {

                        data.wait();

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }

            }

            T entity = null;

            while((entity = data.poll()) != null){

                process(entity);

            }

            lastTime = System.currentTimeMillis();

        }

    }

    

    /**

     * 处理实现

     * @param entity

     */

    protected abstract void process(T entity);

    

    /**

     * 添加要处理的数据

     * @param entity

     */

    public final void batch(T... entity){

        if(entity != null){

            data.addAll(Arrays.asList(entity));

        }

    }

    

    private class SecScanf implements Runnable {

        boolean stop = false;

        

        @Override

        public void run() {

            while(!stop){

                long current = System.currentTimeMillis();

                if(data.size() >= recordNum || current - lastTime > idleTime){

                    synchronized (data) {

                        data.notify();

                    }

                }

                try {

                    Thread.sleep(interval);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

            }

        }

    }

}

时间: 2024-10-10 17:14:06

小工具实现的相关文章

大有学问的刷漆小工具

在进行装修过程中占有相当重要的一部分--刷漆,因为墙面粉刷的结果会直接影响着整个家装的质量.要做到完美粉刷墙面当然少不了我们刷漆小工具,这些工具都有哪些呢?让我们一起来看看吧. 工具之一--需用滚筒刷墙面 又称滚筒,需搭配漆盘使用的滚筒刷,由于滚面范围广,所以是最省力.省时的刷具,尤其是接上延长杆后,可轻易粉刷墙面高处或天花板,但缺点是容易产生漆料喷溅的状况,所以滚筒刷的毛不要太短,但一定要细,这样刷出来的漆膜才会手感细腻. 滚筒刷分长毛,中毛.短毛三种,其表现为滚筒刷毛的长短,而不是滚筒本身的

手把手教你做音乐播放器(八)桌面小工具(上)

第8节 桌面小工具 桌面小工具是可以放置在主界面的.快速控制应用的小助手.例如我们的音乐小工具,它可以帮助用户在桌面上就完成音乐的暂停.播放.切换等操作,而不需要启动应用本身. 在安卓系统中,我们也常常叫它App widget. 实现一个App widget要经过以下几个步骤, 创建一个App widget类,让它继承自AppWidgetProvider,例如AnddleMusicAppWidget类: 放在res\layout目录下,为App widget的界面定义一个布局,例如anddle_

这些小工具让你的Android 开发更高效

在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vysor Vysor 是一个可以将手机的屏幕投影到电脑上,当然也可以操作,当我们做分享或者演示的时候,这个工具起到了作用. Vector Asset Android Studio 在1.4 支持了VectorAsset,所谓VectorAsset:它可以帮助你在Android 项目中添加Materia

原创SQlServer数据库生成简单的说明文档小工具(附源码)

这是一款简单的数据库文档生成工具,主要实现了SQlServer生成说明文档的小工具,目前不够完善,主要可以把数据库的表以及表的详细字段信息,导出到 Word中,可以方便开发人员了解数据库的信息或写技术说明文档. 技术上主要采用的 C#+Dapper+Npod ,开发工具为Vs2015,基于Net4.5框架. 实现思路: 1.首先获取数据库的字符串,测试链接是否成功, 2.通过脚本获取该服务器的数据库列表. 3.根据数据库找到该数据库的所有数据表 4.通过脚本找到该数据表所有的字段信息 5.使用N

Java正则表达式——测试正则表达式的一个小工具

正则表达式是一种强大而灵活的文本处理工具.使用它我们能以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索.一旦找到了匹配这些模式的部分,你就能够随心所欲地对它们进行处理. 关于正则表达式的语法,网上对此有介绍的文章实在是多不胜数,实在找不到,还可以查看Java的API文档,就不多介绍了.这里主要介绍一个可以测试正则表达式的小工具.直接上代码: 1 package com.test.stringregex; 2 //{Args: abcabcabcdefabc "abc+" &q

JSON格式化着色小工具

在我们系统开发过程中越来越多的使用JSON作为数据交换的载体.JSON的特点是层次结构简洁清晰,易于人阅读和编写.同时也易于机器解析和生成.对于机器解析和生成这点本人表示认可,然而对于易于人阅读和编写可以通过下面一段JSON字符串来验证下: {"strValue":"here is str value","nullValue":null,"intvalue":999,"doublevalue":999,&q

强大的pdf文件操作小工具——PDFtk的小白用法

前言 作为程序员,大家都知道的,总是会被技术小白问各种跟编程没什么关系的硬件.软件问题.曾经被一技术小白同事问到有没有什么办法合并pdf文件,当时自己也是一头雾水,因为自己工作生活很少会去操作pdf文件,而当时公司对开发人员的电脑权限管理很严格,不论是上网还是安装软件,都受到很大限制,最后硬着头皮忙活了一阵子也没在解决. 前两天在写批处理程序的时候,发现批处理程序是有合并文件的命令的,我忽然想起之前这个同事的问题,就试了一下合并pdf,然而并不行.虽然失落了一下,但本着学习的精神还是百度了一下关

几个常用文本处理小工具tr ,wc,cut,sort,uniq用法详解

几个文本处理的小工具:tr ,wc,cut,sort,uniq 1. tr命令可以对来自标准输入的字符进行替换.压缩和删除.它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大. 语法:tr 选项  SET1 SET2 -c或--complerment:取代所有不属于第一字符集的字符(就是补集): -d或--delete:删除所有属于第一字符集的字符: -s或--squeeze-repeats:把连续重复的字符以单独一个字符表示: -t或--truncate-set1:先删除第

Android Studio添加Parcelable序列化小工具(快速提高开发效率)

Android Studio添加Parcelable序列化小工具(快速提高开发效率) Android Studio是google专门为开发Android提供的开发工具,在它内部可以直接的添加一些非常好用的开发小工具,这里就讲解怎样添加这些小工具,并且向大家推荐一个非常有用的对象传递时,必须要把对象序列化的接口Parcelable小工具; 这里先介绍下 Android中实现序列化的两个选择:一是实现Serializable接口(是JavaSE本身就支持的),一是实现Parcelable接口(是An

axis2 利用小工具cat.aar

Axis2: Web Service是现在最适合实现SOAP的技术,而Axis2是实现Web Service的一种技术框架(架构). 昨天把把菜刀脚本打包发现<>在xml会被转义,导致菜刀客户端无法连接.看起来别人可以修改response类型,但是我没成功.利用之前发的Cat小工具打包成aar就可以玩了. axis2管理登陆默认配置了用户名为admin,密码axis2: axis2管理后台: 想要deploy 自己的应用需要先打成对应的aar.jar包.用eclipse安装axis2插件. S