在写实时应用解析日志的时候,有如下代码:

 public class CalPvLogParse {
private static SimpleDateFormat logTimeFormat = new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss"); public static CalPvLog process(PvLog pvLog) {
try {
String dateStr = DateUtil.getDateStr(logTimeFormat.parse(pvLog.getLogTime()));
String hourStr = DateUtil.getHourStr(logTimeFormat.parse(pvLog.getLogTime()));
String cookie = pvLog.getCookie();
String displayType = pvLog.getDisplayType();
String kdt_id = pvLog.getKdt_id();
String displayId = pvLog.getDisplayId();
return new CalPvLog(dateStr, hourStr, cookie, displayType, displayId, kdt_id);
}
catch (ParseException e) {
System.err.println("parse CalPvLog error");
return null;
}
}
}

以上代码在写的单元测试中能够顺利通过,但是接线上以后总是出现一些莫名奇怪的错误。报的异常基本在代码6,7行处(由于当时没有截图,所以不能贴了)。查了一下,原因是SimpleDateFormat不是线程安全的。一个简单的解决办法是每次解析时都重新new一个SimpleDateFormat对象,但是资源耗费厉害。后来发现,java有比较成熟的处理日期各种格式转化的joda-time库,接口简单并且是线程安全的,修改如下:

 public class CalPvLogParse {
private static DateTimeFormatter format = DateTimeFormat.forPattern("yyyy/MM/dd-HH:mm:ss"); public static CalPvLog process(PvLog pvLog) {
DateTime dateTime = DateTime.parse(pvLog.getLogTime(), format);
String dateStr = dateTime.toString("MMdd");
String hourStr = dateTime.toString("HH");
String cookie = pvLog.getCookie();
String displayType = pvLog.getDisplayType();
String kdt_id = pvLog.getKdt_id();
String displayId = pvLog.getDisplayId();
return new CalPvLog(dateStr, hourStr, cookie, displayType, displayId, kdt_id);
}
}

修改以后,问题解决。 另外pom配置如下:

         <dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.4</version>
</dependency>

DateFormat 多线程问题的更多相关文章

  1. java.text.DateFormat 多线程并发问题

    在日常开发中,java.text.DateFormat 应该算是使用频率比较高的一个工具类,经常会使用它 将 Date 对象转换成字符串日期,或者将字符串日期转化成 Date 对象.先来看一段眼熟的代 ...

  2. java 多线程:线程安全问题,示例DateFormat多线程执行冲突解决方案ThreadLocal、方法内变量

    SimpleDateFormat多线程中执行报错 java.lang.NumberFormatException: For input string: ""   import ja ...

  3. DateFormat多线程使用问题

    reference DateFormat in a Multithreading Environment

  4. JAVA 技术手册 卷1 第十四章『多线程』 读书摘要

    什么是线程 进程受CPU时间片的轮转调度,进而予人多任务并发的感觉. 线程在更低层次上扩展多任务概念,一个进程通常包含多个线程. 进程各自数据独立,而线程共享数据. 数据独立使进程相互通信变得繁难,共 ...

  5. Java多线程编程核心技术---拾遗增补

    线程状态验证 public class MyThread extends Thread { public MyThread() { System.out.println("构造方法中的状态: ...

  6. SimpleDateFormat做成员或者静态成员多线程安全隐患

    转自:http://blog.csdn.net/jeamking/article/details/7183958 有时我们在同一个类中都是使用同一种日期格式,又或者为了减少new SimpleDate ...

  7. 《Java核心技术卷一》笔记 多线程同步(底层实现)

    一.锁的基本原理 多个线程同时对共享的同一数据存取 ,在这种竞争条件下如果不进行同步很可能会造成数据的讹误. 例如:有一个共享变量int sum=0, 一个线程正调用 sum+=10,另一个线程正好也 ...

  8. 基于事件的 NIO 多线程服务器--转载

    JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程开销的问题,在 NIO 中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分使用用多个 CPU 的处 ...

  9. JAVA NIO 结合多线程

    NIO 的选择器采用了多路复用(Multiplexing)技术,可在一个选择器上处理多个套接字, 通过获取读写通道来进行 IO 操作.由于网络带宽等原因,在通道的读.写操作中是容易出现等待的, 所以在 ...

随机推荐

  1. HDU.P1100 Trees Made to Order 解题报告

    http://www.cnblogs.com/keam37/p/3637717.html  keam所有 转载请注明出处 Problem Description We can number binar ...

  2. Java电商项目-6.实现门户首页数据展示_Redis数据缓存

    目录 项目的Github地址 需求介绍 搭建Redis集群环境 下面先描述单机版redis的安装 下面将进行Redis3主3从集群环境搭建 基于SOA架构, 创建门户ashop-portal-web门 ...

  3. Android GIS开发系列-- 入门季(13)Gdal简单写个shp文件

    Gdal是用来读写栅格与矢量数据的,在Gdal官网,可以下载相关的资源进行平台的编译.其实Arcgis底层也是用Gdal来读取shp文件的,那在Android中可以直接读写shp文件吗,是可以的.这里 ...

  4. docker: 通过docker方式安装jenkins

    1. docker pull jenkins 2. docker run -d -p 49001:8080 -v $PWD/jenkins:/var/jenkins_home:z -t jenkins ...

  5. tomcat的HTTPS

    完美配置Tomcat的HTTPS 博客分类: Tomcat HTTPS   Tomcat配置HTTPS的文章到处都有,过程也比较简单,随后文中会转一段过来. 但对于启用APR情况下报异常“java.l ...

  6. ppt五种经典字体组合

    在做ppt中常常为使用哪种字体而头疼,如今将ppt的经典字体附上.希望对大家有帮助 五种经典的字体组合 标题字体 正文字体 使用场合 方正综艺简体 微软雅黑 课题汇报.咨询报告.学术研讨等正式场合 方 ...

  7. webpack之傻瓜式教程(转载)

    1.安装好nodejs,安装过程网上找. 2.在D盘.E盘或任意一个磁盘中新建文件夹,命名为webpack_demo: 3.在webpack_demo文件下按住Shift键后点击鼠标右键,再左键点击“ ...

  8. spark hadoop 对比 Resilient Distributed Datasets

    hadoop 迭代消耗大 每次迭代启动一个完整的MapReduce作业 spark 首要目标就是避免运算时 过多的网络和磁盘IO开销 Resilient Distributed Datasets ht ...

  9. 利用函数计算构建微信小程序的Server端

    10分钟上线 - 利用函数计算构建微信小程序的Server端-博客-云栖社区-阿里云 https://yq.aliyun.com/articles/435430 函数计算  读写 oss import ...

  10. robo 3t 在 ubuntu下安装

    如果您尝试安装最新版本robomobo调用可以现在robo3t.或者你尝试在Ubuntu 16.04上安装,按照下面的步骤和你的robomongo安装 下载最新的robomongo tar文件 wge ...