往数据库里插入大量的数据,当然是批量插入最高效,我们设定一个题目,每次把数据放入队列,当数据大于1000条或者时间大于5分钟后把数据批量入库
队列处理代码:
package bathQueue; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; /** * <p>Title: BatchQueue.java</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2014</p> * @author 雪含心 * @date 2014年3月1日 */ public class BatchQueue<T> { // 默认间隔处理队列时间 private static int DEFAULT_TIME = 5000; // 默认队列处理长度 private static int DEFAULT_COUNT = 2000; // 设置队列处理时间 private long handleTime; // 设置队列处理长度 private int handleLength; // 阻塞队列 ArrayBlockingQueue<T> queue = new ArrayBlockingQueue<T>(20000); // 回调接口 private QueueProcess<T> process; // 用来存放从队列拿出的数据 private List<T> dataList; // 往队列添加数据 public void add(T t){ queue.add(t); } // 清理生成的list public void clearList(){ dataList = null; dataList = new ArrayList<T>(); } /** * 最原始的构造方法,使用这个构造方法设置默认的队列处理时间和数量 * @param process */ public BatchQueue(QueueProcess<T> process){ this(DEFAULT_TIME, DEFAULT_COUNT, process); } /** * 可以设置队列的处理时间和处理长度 * @param handleTime * @param handleQueueLength * @param process */ public BatchQueue(int handleTime, int handleQueueLength, QueueProcess<T> process){ this.process = process; this.handleTime = handleTime; this.handleLength = handleQueueLength; start(); } private void start(){ dataList = new ArrayList<T>(handleLength); DataListener listener = new DataListener(); new Thread(listener).start(); } // 队列监听,当队列达到一定数量和时间后处理队列 class DataListener implements Runnable{ @Override public void run() { long startTime = System.currentTimeMillis(); T t = null; while(true){ try { // 从队列拿出队列头部的元素,如果没有就阻塞 t = queue.take(); if(null != t){ dataList.add(t); } if(dataList.size() >= DEFAULT_COUNT){ startTime = callBack(dataList); continue; } long currentTime = System.currentTimeMillis(); System.out.println("currentTime - startTime" + (currentTime - startTime) + "handleTime==>" + handleTime); if(currentTime - startTime > handleTime){ startTime = callBack(dataList); continue; } } catch (Exception e) { e.printStackTrace(); } } } private long callBack(List<T> dataList) { // 处理队列 try{ System.out.println(dataList); process.processData(dataList); }catch(Exception e){ e.printStackTrace(); }finally{ // 清理掉dataList中的元素 clearList(); } return System.currentTimeMillis(); } } } /** * add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 offer 添加一个元素并返回true 如果队列已满,则返回false poll 移除并返问队列头部的元素 如果队列为空,则返回null peek 返回队列头部的元素 如果队列为空,则返回null put 添加一个元素 如果队列满,则阻塞 take 移除并返回队列头部的元素 如果队列为空,则阻塞 */
数据处理抽象类
package com.zh.utils; import java.util.List; /** * 批量数据回调接口 * @author zhanghua * * @param <T> */ public interface BatchQueueCallback<T> { /** * 用于接收批量数据 * @param list 批量数据 */ public abstract void batch(List<T> list); }
数据库处理示例
package bathQueue; import java.util.List; /** * <p>Title: DataInsert.java</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2014</p> * @author 雪含心 * @param <T> * @date 2014年3月1日 */ public class DataInsert<T> extends QueueProcess<T> { @Override public void processData(List<T> list) { } public static void main(String[] args) throws Exception{ DataInsert back = new DataInsert<>(); BatchQueue<String> queue = new BatchQueue<String>(back); for(int i = 0; i < 20000; i ++){ queue.add("a" +i); Thread.sleep(2000); } } }
相关推荐
java 自定义Queue队列 java 自定义Queue队列
java 多线程 队列工厂
主要介绍了JAVA 实现延迟队列的方法,文中讲解非常详细,供大家参考和学习,感兴趣的朋友可以了解下
kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列...
这是一个java队列实现的全部工程文件,包含了所有代码,具体的设计文档在上传的另外文件中。这个工程能够实现所有队列的操作,运行没有问题。设计的是在应用程序上的基于界面的队列操作的实现。
Java消息队列常见面试题,2022年最新,104页,祝您斩获高薪offer! Java消息队列常见面试题,2022年最新,104页,祝您斩获高薪offer! Java消息队列常见面试题,2022年最新,104页,祝您斩获高薪offer! Java消息...
java队列实现(顺序队列、链式队列、循环队列)
java2里面没有提供标准类对队列的支持,我就编写了一个用java实现的队列类。可以供参考。
实现java模拟阻塞队列的例子,该代码包括,阻塞队列实现生产者,消费者。和模拟阻塞队列实现生产者及消费者模式,帮助你更好的理解java多线程
java多线程加队列上传文件_后台处理
利用java写的一些关于栈和队列的小例子,拿出来供大家分享和学习.
java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号 java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号
银行业务队列简单模拟 java银行业务队列简单模拟.zipjava银行业务队列简单模拟.zipjava银行业务队列简单模拟.zipjava银行业务队列简单模拟.zipjava银行业务队列简单模拟.zip
用Java实现一个队列
内容是一个javaspring结构的模块,设计了处理高并发解决方案,消息队列处理业务逻辑的代码设计,注意:1 只是一个模块,不是一个可运行项目,2 需要项目结构是java spring,3 需要自己选择并搭建所使用的消息队列。
优先队列-java可以选择属性和升序降序
银行业务队列简单模拟 java银行业务队列简单模拟源码.zipjava银行业务队列简单模拟源码.zipjava银行业务队列简单模拟源码.zipjava银行业务队列简单模拟源码.zip
java实现的队列,通过图的方式来演示环形队列的结构和原理,通过图从感官上了解队列的形式,从逻辑上更好的明白环形队列的实质。
NULL 博文链接:https://j2ee2009.iteye.com/blog/689161
用java实现插入排序InsertSort 用java实现插入排序InsertSort用 java实现插入排序InsertSort