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中利用线程和队列实现入库操作相关推荐

  1. java中怎样创建线程_java中的线程创建和使用

    Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口.Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合 ...

  2. java 文件指定位置插入_java 中利用io流将一个文件插入到另一个文件中的指定位置,指定位置...

    展开全部 import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.F ...

  3. java线程池怎么创建_java中的线程池,如何创建?

    Java中的线程池它是线程的容器,或者(换句话说,它是具有执行任务能力的线程的集合). 我们可以使用ThreadPool框架来定位(或实现)线程池. 线程池可以包含多个线程.每当我们执行任何任务时,线 ...

  4. Java 线程池中的线程复用是如何实现的?

    前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...

  5. java线程池newfi_Java 线程池中的线程复用是如何实现的?

    前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 那么就来和大家探讨下这个问题,在线程池中,线程会从 workQueue 中读取任务来执行,最小的执行单位就是 Worker,Worke ...

  6. java多线程优先级的方法_Java多线程以及线程优先级

    文章目录 1 继承Thread类多线程的实现获取和设置线程名称线程优先级 2 实现Runnable接口3 实现Callable接口4 使用线程池 1 继承Thread类 多线程的实现 实现多线程只需要 ...

  7. Java 确定线程池中工作线程数的大小

    以问答形式展开,会更有针对性: 1.工作线程是不是越多越好? 不是.a.服务器cpu核数有限,所以同时并发或者并行的线程数是有限的,所以1核cpu设置1000个线程是没有意义的. b.线程切换也是有开 ...

  8. python 判断线程是否执行完毕_判断线程池中的线程是否全部执行完毕

    在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种 ...

  9. 判断线程池中的线程是否全部执行完毕

    在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种 ...

最新文章

  1. 一道神坑题 POJ3026 Borg Maze BFS+prim算法
  2. day11-元组与字典
  3. linux内核 频率,Linux内核中CPU主频和电压调整 (三)
  4. Docker完全自学手册
  5. mongoose 入门以及 mongoose 实现数据 的增、删、改、查
  6. 一行代码就能解决微服务分布式事务问题,你知道GTS怎么做到的吗?
  7. 【干货】从数字化洞察新消费趋势看数字化如何赋能企业.pdf(附下载链接)
  8. android实战开发02
  9. Windows Phone 7之初体验(四.平台架构简介)
  10. activiti启动流程实例
  11. 恩佐盒子服务器维护,恩佐宝盒有苹果版吗
  12. lept_json的学习之stringify
  13. Android关于Activity屏蔽/拦截Home键
  14. 心得|Python新手如何渡过小白期,不再当菜鸟程序员?
  15. Chrome插件:云音乐听歌识曲
  16. 接口自动化测试(1)
  17. aso优化师是什么_连这些名词都不懂,还好意思说你是ASO优化师?
  18. java统一返回结果集封装,解决No converter found for return value of type
  19. Android开发MVP模式(解决了View和Model的耦合)
  20. 手持设备的可用性研究

热门文章

  1. 桌面虚拟化之资源分配
  2. MySQL Cluster(MySQL 集群) 初试
  3. ios在异步网络请求上实现同步逻辑
  4. lnmp之mysql原码编译
  5. (转)javascript关于运动的各种问题经典总结
  6. 在用户控件中撰写JS时控件的客户端ID问题
  7. mysql数据库访问控制_一文总结MySQL数据库访问控制实现原理
  8. python写http文件下载器_http分片请求-python分片下载文件
  9. 通讯系统流程图_基于OBD系统的量产车评估测试(PVE)
  10. sql中的begin....end