SimpleDateFormat-多线程问题
SimpleDateFormat-多线程问题:
SimpleDateFormat类在多线程环境下中处理日期,极易出现日期转换错误的情况
1 import java.text.ParseException; 2 import java.text.SimpleDateFormat; 3 import java.util.Date; 4 5 /** 6 * 线程类 7 */ 8 public class MyThread extends Thread { 9 10 private SimpleDateFormat sdf; 11 private String dateString; 12 13 public MyThread(SimpleDateFormat sdf,String dateString) { 14 this.sdf = sdf; 15 this.dateString = dateString; 16 } 17 18 @Override 19 public void run() { 20 try { 21 Date dateRef = sdf.parse(dateString); 22 String newDateString = sdf.format(dateRef).toString(); 23 if(!newDateString.equals(dateString)) { 24 System.out.println("ThreadName = " + Thread.currentThread().getName() 25 + "报错了 日期字符串:" + dateString + "转换成日期为:" + newDateString); 26 } 27 } catch (ParseException e) { 28 e.printStackTrace(); 29 } 30 } 31 }
1 import java.text.SimpleDateFormat; 2 3 public class Test { 4 5 /** 6 * 测试单例的SimpleDateFormat类在多线程环境下中处理日期,极易出现日期转换错误的情况 7 */ 8 public static void main(String[] args) { 9 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 10 String[] dateStringArray = new String[] { 11 "2000-01-01","2000-01-02","2000-01-03", 12 "2000-01-04","2000-01-05","2000-01-06", 13 "2000-01-07","2000-01-08","2000-01-09", 14 "2000-01-10" 15 }; 16 17 MyThread[] threadArray = new MyThread[10]; 18 for (int i = 0; i < 10; i++) { 19 threadArray[i] = new MyThread(sdf, dateStringArray[i]); 20 } 21 for (int i = 0; i < 10; i++) { 22 threadArray[i].start(); 23 } 24 } 25 }
运行之后会输出很多的错误信息!
解决多线程出现的问题-为每个线程实例一个SimpleDateFormat:
1 import java.text.ParseException; 2 import java.util.Date; 3 4 /** 5 * 线程类 6 */ 7 public class MyThread extends Thread { 8 9 private String dateString; 10 public MyThread(String dateString) { 11 this.dateString = dateString; 12 } 13 14 @Override 15 public void run() { 16 try { 17 Date dateRef = DateTools.parse("yyyy-MM-dd", dateString); 18 String newDateString = DateTools.format("yyyy-MM-dd",dateRef).toString(); 19 if(!newDateString.equals(dateString)) { 20 System.out.println("ThreadName = " + Thread.currentThread().getName() 21 + "报错了 日期字符串:" + dateString + "转换成日期为:" + newDateString); 22 } 23 } catch (ParseException e) { 24 e.printStackTrace(); 25 } 26 } 27 }
1 import java.text.ParseException; 2 import java.text.SimpleDateFormat; 3 import java.util.Date; 4 5 /** 6 * 日期格式化工具类 7 */ 8 public class DateTools { 9 10 public static Date parse(String formatPattern,String dateString) throws ParseException { 11 return new SimpleDateFormat(formatPattern).parse(dateString); 12 } 13 14 public static String format(String formatPattern,Date date) throws ParseException { 15 return new SimpleDateFormat(formatPattern).format(date).toString(); 16 } 17 }
1 public class Test { 2 3 /** 4 * 测试,运行程序后,控制台没有任何输出,也就是转换没有任何异常, 5 * 原理:创建了多个SimpleDateFormat实例 6 */ 7 public static void main(String[] args) { 8 String[] dateStringArray = new String[] { 9 "2000-01-01","2000-01-02","2000-01-03", 10 "2000-01-04","2000-01-05","2000-01-06", 11 "2000-01-07","2000-01-08","2000-01-09", 12 "2000-01-10" 13 }; 14 15 MyThread[] threadArray = new MyThread[10]; 16 for (int i = 0; i < 10; i++) { 17 threadArray[i] = new MyThread(dateStringArray[i]); 18 } 19 for (int i = 0; i < 10; i++) { 20 threadArray[i].start(); 21 } 22 } 23 }
解决多线程出现的问题-使用ThreadLocal:
1 import java.text.ParseException; 2 import java.util.Date; 3 4 /** 5 * 线程类 6 */ 7 public class MyThread extends Thread { 8 9 private String dateString; 10 public MyThread(String dateString) { 11 this.dateString = dateString; 12 } 13 14 @Override 15 public void run() { 16 try { 17 Date dateRef = DateTools.getSimpleDateFormat("yyyy-MM-dd").parse(dateString); 18 String newDateString = DateTools.getSimpleDateFormat("yyyy-MM-dd").format(dateRef).toString(); 19 if(!newDateString.equals(dateString)) { 20 System.out.println("ThreadName = " + Thread.currentThread().getName() 21 + "报错了 日期字符串:" + dateString + "转换成日期为:" + newDateString); 22 } 23 } catch (ParseException e) { 24 e.printStackTrace(); 25 } 26 } 27 }
1 import java.text.SimpleDateFormat; 2 3 /** 4 * 日期格式化工具类,使用ThreadLocal解决SimpleDateFormat非线程安全问题 5 */ 6 public class DateTools { 7 8 private static ThreadLocal<SimpleDateFormat> t1 = new ThreadLocal<>(); 9 10 public static SimpleDateFormat getSimpleDateFormat(String datePattern) { 11 SimpleDateFormat sdf = null; 12 sdf = t1.get(); 13 if(sdf == null) { 14 sdf = new SimpleDateFormat(datePattern); 15 t1.set(sdf); 16 } 17 return sdf; 18 } 19 }
1 public class Test { 2 3 /** 4 * 测试,运行程序后,控制台没有任何输出,也就是转换没有任何异常 5 * 原理:每个线程都会有自己的ThreadLocal存储全局变量,也就是每个线程都有自己的SimpleDateFormat实例 6 */ 7 public static void main(String[] args) { 8 String[] dateStringArray = new String[] { 9 "2000-01-01","2000-01-02","2000-01-03", 10 "2000-01-04","2000-01-05","2000-01-06", 11 "2000-01-07","2000-01-08","2000-01-09", 12 "2000-01-10" 13 }; 14 15 MyThread[] threadArray = new MyThread[10]; 16 for (int i = 0; i < 10; i++) { 17 threadArray[i] = new MyThread(dateStringArray[i]); 18 } 19 for (int i = 0; i < 10; i++) { 20 threadArray[i].start(); 21 } 22 } 23 }
转载于:https://www.cnblogs.com/wang1001/p/9585526.html
SimpleDateFormat-多线程问题相关推荐
- java.text.SimpleDateFormat多线程下的问题
1. 今天在做性能压测的时候发现java.text.SimpleDateFormat多线程下的错误 2. 先贴出两段错误大家看一下: Exception in thread "pool-1- ...
- SparkStreaming编程
0. SparkStreaming 流式计算简介 SparkStreaming实时处理入门案例 SparkStreaming和HDFS整合 SparkStreaming与Kafka整合 SparkSt ...
- JEECG 3.7.1版本发布,企业级JAVA快速开发平台
JEECG 3.7.1 版本发布,企业级JAVA快速开发平台 ---------------------------------------- Version: Jeecg_3.7.1 项 目: ...
- Java日期时间类及计算
1. Java中与日期相关的类 1.1 java.util包 类名 具体描述 Date Date对象算是JAVA中历史比较悠久的用于处理日期.时间相关的类了,但是随着版本的迭代演进,其中的众多方法都已 ...
- Java开发规范整理
Java开发规范整理 (参考<Java开发手册嵩山版>) 文章目录 Java开发规范整理 一.编程规约 (一)命名 (二)常量定义 (三)代码格式 (四)OOP面向对象程序设计 (五)时间 ...
- 丢失的8小时去哪里了?SimpleDateFormat线程不安全,多线程初始化异常解决方案
前言 本次参加了2月份的征文活动,说是对时间的处理问题,我这有2个点需要分享一下,一个是上大学的时候碰到的,还有就是在工作中遇到的由于[SimpleDateFormat线程不安全]在多线程时间初始化的 ...
- 多线程、并发及线程的基础问题
1)Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引用指向的数组,将会受到 vo ...
- dateformat java 并发_java.text.DateFormat 多线程并发问题
在日常开发中,java.text.DateFormat 应该算是使用频率比较高的一个工具类,经常会使用它 将 Date 对象转换成字符串日期,或者将字符串日期转化成 Date 对象.先来看一段眼熟的代 ...
- java 静态代码块 多线程,Java多线程编程笔记10:单例模式
立即加载:"饿汉模式" 立即加载就是指使用类的时候已经将对象创建完毕,常见的实现方法就是直接new实例化.也就是在调用方法前,实例就被创建了.示例代码如下所示: class MyO ...
- 深入理解Java:SimpleDateFormat安全的时间格式化
转自:http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html 想必大家对SimpleDateFormat并不陌生.SimpleDate ...
最新文章
- Laravel Dcat-admin 详情页多栏布局开发
- New Android Application 的介绍
- Winio驱动在64位windows下无法使用的解决方法
- 18岁辍学,22岁进谷歌和Jeff Dean谈笑风生,这样的我究竟需不需要本科文凭?
- java 企业门户网站 源码 自适应响应式 freemarker 静态引擎 html5 SSM
- CTF-Misc-CRC32碰撞脚本 (二)
- 多文件目录下makefile文件递归执行编译所有c文件 很不错
- outdated: 3.Adding Color
- trunk口_南京课工场IT培训:VLAN、Trunk与三层交换机的相关理论知识
- WPF RadioButton按钮控件取消选中设置
- QTableView自定义拖拽行
- Android之Http通信——1.初识Http协议
- 计算机网络中的分组交换是什么,什么是分组交换
- 软件可靠性测试概念与应用
- Python爬虫入门教程 25-100 知乎文章图片爬取器之一
- python测试request代理IP是否替换
- 使用单片机的串口蓝牙通信写的接收SBUF里的数据,并进行发送执行命令,显示在数码管上,波特率9600
- 自己封装的1200,1500PLC通过工艺轴方式控制伺服电机的FB块
- 网络-电脑网络突然变成球形, 网络不可用
- 全新2007高校BBS 睿智的冷笑话
热门文章
- 氩焊机器人编程_如何操作焊接机器人的编程?这六点是基础!
- string和数值之间的转换
- postman支持socket吗_如何使用postman测试接口webservice?
- java interface作用是什么_关于Java反射原理:
- 回归分析常数项t值没有显著异于零怎么办_洋蜜蜂统计辅导专题:回归分析关键词统计量须知...
- 算法萌新如何学好动态规划(三)
- php获取最后一条记录的id,获取MySQL的表中每个userid最后一条记录的方法_MySQL
- 卡爆mysql_荐 MySQL死锁和卡死分析
- linux 桌面共享xfce,漂亮而且轻量级的桌面-----xfce安装
- 简单聊聊智能硬件的固件测试