java队列怎么实现线程_Java中利用线程和队列实现入库操作
Java单线程中,如果需要大量的数据库操作,会在IO方面产生瓶颈,特别是数据库连接失败时,大量资源会消耗在数据库连接的检测上,从而使程序的实时响应速度变慢。解决的办法就是将数据库操作单独放置在一个线程中运行,利用队列的特性实现数据接收和入库处理,典型的生产者和消费者的例子。这样为模块化及进一步改进程序提供方便。
线程的实现只要extends Thread就行了,线程的工作在run()方法中实现。实现线程自启动,最好在构造函数中加一句start(),这个很容易。
集合如果选用blockingqueue,要自己实现一堆方法,挺麻烦的,如果使用java.util.Vector就方便很多,相对于ArrayList来说,它线程是安全的。
最近项目需要,写了一个例子,为了结构清晰,去掉了冗余的各种处理,适合有类似的需求的朋友在此基础上加入自己特有的需求实现。
主要代码如下:
import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Calendar; import java.util.Vector;
import com.StartPoint;
import com.AInfo; //引用自定义数据类型 import com.CInfo; //引用自定义数据类型 import com.GInfo; //引用自定义数据类型
public class OperateDB extends Thread { Connection con;
private Vector QueueGPS; private Vector QueueCCS; private Vector QueueCGZ; private int intListCount=0;
public OperateDB(Connection pcon) { con=pcon; QueueGPS = new Vector(); QueueCCS = new Vector(); QueueCGZ = new Vector(); start(); } public int insertGps(GInfo oItem) { QueueGPS.add(oItem); return ++intListCount; } public int insertCInfo(CInfo oItem) { QueueCCS.add(oItem); return ++intListCount; } public int insertAInfo(AInfo oItem) { QueueCGZ.add(oItem); return ++intListCount; } public void run() { while (true) { try { if (intListCount > 0) { int len = QueueGPS.size(); for (int i = 0; i < len; i++) { inputGInfo(QueueGPS.remove(0)); intListCount--; } len = QueueCCS.size(); for (int i = 0; i < len; i++) { inputCInfo(QueueCCS.remove(0)); intListCount--; } len = QueueCGZ.size(); for (int i = 0; i < len; i++) { inputAInfo(QueueCGZ.remove(0)); intListCount--; } } else { Thread.sleep(2000); } } catch (Exception e) { e.printStackTrace(); } } } /** * 增加一条记录 */ private int inputGInfo(GInfo o) { int tmp = 0; try { String sql = "insert into t_ginfo(car,intime,gtime,mainid,subid) values(?,sysdate,to_date(?,'yyyy-mm-dd hh24:mi:ss'),?,?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, o.getCAR()); pstmt.setString(2, o.gTime()); pstmt.setInt(3, o.getMainId()); pstmt.setInt(4, o.getSubId()); tmp = pstmt.executeUpdate(); pstmt.close(); } catch (Exception e) { e.printStackTrace(); } return tmp; }
private int inputCInfo(CInfo o) { int tmp = 0; try { String sql = "insert into t_cinfo(car,intime,gtime,mainid,subid) values(?,sysdate,to_date(?,'yyyy-mm-dd hh24:mi:ss'),?,?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, o.getCAR()); pstmt.setString(2, o.gTime()); pstmt.setInt(3, o.getMainId()); pstmt.setInt(4, o.getSubId()); tmp = pstmt.executeUpdate(); pstmt.close(); } catch (Exception e) { e.printStackTrace(); } return tmp; }
private int inputAInfo(AInfo o) { int tmp = 0; try { String sql = "insert into t_ainfo(car,intime,gtime,mainid,subid) values(?,sysdate,to_date(?,'yyyy-mm-dd hh24:mi:ss'),?,?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, o.getCAR()); pstmt.setString(2, o.gTime()); pstmt.setInt(3, o.getMainId()); pstmt.setInt(4, o.getSubId()); tmp = pstmt.executeUpdate(); pstmt.close(); System.out.println("------告警数据插入成功"); } catch (Exception e) { e.printStackTrace(); } return tmp; } }
调用如下:
OperateDB db = new OperateDB(getConnection());
public void run() {
while(true) { String sData = GetReceiveString(); GInfo g = GetGInfoByString(sData); db.insertGInfo(g); } }
java队列怎么实现线程_Java中利用线程和队列实现入库操作相关推荐
- java中怎样创建线程_java中的线程创建和使用
Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口.Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合 ...
- java 文件指定位置插入_java 中利用io流将一个文件插入到另一个文件中的指定位置,指定位置...
展开全部 import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.F ...
- java线程池怎么创建_java中的线程池,如何创建?
Java中的线程池它是线程的容器,或者(换句话说,它是具有执行任务能力的线程的集合). 我们可以使用ThreadPool框架来定位(或实现)线程池. 线程池可以包含多个线程.每当我们执行任何任务时,线 ...
- Java 线程池中的线程复用是如何实现的?
前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...
- java线程池newfi_Java 线程池中的线程复用是如何实现的?
前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 那么就来和大家探讨下这个问题,在线程池中,线程会从 workQueue 中读取任务来执行,最小的执行单位就是 Worker,Worke ...
- java多线程优先级的方法_Java多线程以及线程优先级
文章目录 1 继承Thread类多线程的实现获取和设置线程名称线程优先级 2 实现Runnable接口3 实现Callable接口4 使用线程池 1 继承Thread类 多线程的实现 实现多线程只需要 ...
- Java 确定线程池中工作线程数的大小
以问答形式展开,会更有针对性: 1.工作线程是不是越多越好? 不是.a.服务器cpu核数有限,所以同时并发或者并行的线程数是有限的,所以1核cpu设置1000个线程是没有意义的. b.线程切换也是有开 ...
- python 判断线程是否执行完毕_判断线程池中的线程是否全部执行完毕
在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种 ...
- 判断线程池中的线程是否全部执行完毕
在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种 ...
最新文章
- 一道神坑题 POJ3026 Borg Maze BFS+prim算法
- day11-元组与字典
- linux内核 频率,Linux内核中CPU主频和电压调整 (三)
- Docker完全自学手册
- mongoose 入门以及 mongoose 实现数据 的增、删、改、查
- 一行代码就能解决微服务分布式事务问题,你知道GTS怎么做到的吗?
- 【干货】从数字化洞察新消费趋势看数字化如何赋能企业.pdf(附下载链接)
- android实战开发02
- Windows Phone 7之初体验(四.平台架构简介)
- activiti启动流程实例
- 恩佐盒子服务器维护,恩佐宝盒有苹果版吗
- lept_json的学习之stringify
- Android关于Activity屏蔽/拦截Home键
- 心得|Python新手如何渡过小白期,不再当菜鸟程序员?
- Chrome插件:云音乐听歌识曲
- 接口自动化测试(1)
- aso优化师是什么_连这些名词都不懂,还好意思说你是ASO优化师?
- java统一返回结果集封装,解决No converter found for return value of type
- Android开发MVP模式(解决了View和Model的耦合)
- 手持设备的可用性研究
热门文章
- 桌面虚拟化之资源分配
- MySQL Cluster(MySQL 集群) 初试
- ios在异步网络请求上实现同步逻辑
- lnmp之mysql原码编译
- (转)javascript关于运动的各种问题经典总结
- 在用户控件中撰写JS时控件的客户端ID问题
- mysql数据库访问控制_一文总结MySQL数据库访问控制实现原理
- python写http文件下载器_http分片请求-python分片下载文件
- 通讯系统流程图_基于OBD系统的量产车评估测试(PVE)
- sql中的begin....end