Java多线程环境下SimpleDateFormat类安全转换

 更新时间:2020年02月09日 15:03:01   作者:三名狂客  
这篇文章主要介绍了Java多线程环境下SimpleDateFormat类安全转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、SimpleDateFormat类

package state;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * SimpleDateFormat类负责日期的转换与格式化
 * 解决SimpleDateFormat类多线程环境下转换错误问题
 * @author zc
 *
 */
public class SimpleDateFormatThread extends Thread{
  private SimpleDateFormat sdf;
  private String dateString;
  
  public SimpleDateFormatThread(SimpleDateFormat sdf,String dateString) {
   super();
   this.sdf =sdf;
   this.dateString =dateString;
  }
  
 @Override
 public void run() {
 
 try {
  //System.out.println(dateString);
  //刚开始日期格式设置错误为YYYY-MM-dd
  Date date =DateTools.getSimpleDateFormat("yyyy-MM-dd").parse(dateString);
      // System.out.println(date);
  String newDateString =DateTools.getSimpleDateFormat("yyyy-MM-dd").format(date).toString();
  
  if(!newDateString.equals(dateString)) {
  System.out.println("ThreadName="+this.getName()+"报错日期"+dateString+" 转换日期"+newDateString);
  }else {
  System.out.println("ThreadName="+this.getName()+"日期"+dateString+"  转换日期"+newDateString);
  }
 } catch (ParseException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 }
 
 public static void main(String[] args) {
 SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
 String[] dateStringArray =new String[]{
  "2020-02-05","2020-02-06","2020-02-07","2020-02-08"
 };
 SimpleDateFormatThread []threadArray= new SimpleDateFormatThread[4];
 for(int i=0;i<4;i++) {
  threadArray[i] =new SimpleDateFormatThread(sdf,dateStringArray[i]);
 }
 for(int i=0;i<4;i++) {
  threadArray[i].start();
 }
 }
}

class DateTools{
 //ThreadLocal能使线程绑定到指定的对象
 private static ThreadLocal<SimpleDateFormat> t = new ThreadLocal<SimpleDateFormat>();
 
 public static SimpleDateFormat getSimpleDateFormat(String datePattern) {
 SimpleDateFormat sdf=null;
 sdf =t.get();
 if(sdf==null) {
  
  sdf =new SimpleDateFormat(datePattern);
   t.set(sdf); 
 }
 return sdf;
 }
}

二、线程状态和线程组

(2)线程5状态
//NEW 尚未启动的线程
//RUNNABLE Java虚拟机中执行的线程
//TERMINATED 已经退出的线程
//BLOCKED 阻塞受监视的线程
//WAITING 无限等待另一个线程
//TIMED_WAITING 等待另一个线程指定时间

package state;
/**
 * 线程中状态和线程组
 * @author zc
 *
 */
public class MyThread extends Thread{
  //NEW
  //RUNNABLE
  //TERMINATED
  //BLOCKED
  //WAITING
  //TIMED_WAITING
 public MyThread() {
 System.out.println("构造方法中的状态: "+Thread.currentThread().getState());
 }
 @Override
 public void run() {
 System.out.println("run方法中的状态:"+Thread.currentThread().getState());
 try {
  Thread.sleep(1000);
 } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 }
 
 public static void main(String[] args) {
   MyThread myThread = new MyThread();
   System.out.println("main方法中的状态1 "+ myThread.getState());
   
   Thread t1 = new Thread();
   Thread t2 = new Thread();
   ThreadGroup group =new ThreadGroup("左氏线程组");
   Thread t3 = new Thread(group,t1);
   Thread t4 = new Thread(group,t2);
   t3.start();
   t4.start();
   System.out.println("活动的线程数量为: " +group.activeCount());
   System.out.println("线程组的名称为: "+group.getName());
   
   try {
  myThread.start();
  Thread.sleep(1000);
  System.out.println("main方法中的状态2 "+ myThread.getState());
 } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解Java前缀树Trie的原理及代码实现

    详解Java前缀树Trie的原理及代码实现

    Trie又被称为前缀树、字典树。Trie利用字符串的公共前缀来高效地存储和检索字符串数据集中的关键词,最大限度地减少无谓的字符串比较,其核心思想是用空间换时间。本文主要介绍了Trie的原理及实现,感兴趣的可以了解一下
    2022-11-11
  • Java 获取 jar包以外的资源操作

    Java 获取 jar包以外的资源操作

    这篇文章主要介绍了Java 获取 jar包以外的资源操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • java微信支付功能实现源码

    java微信支付功能实现源码

    这篇文章主要给大家介绍了关于java微信支付功能实现源码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • springboot 集成dubbo的步骤详解

    springboot 集成dubbo的步骤详解

    这篇文章主要介绍了springboot 简易集成dubbo的步骤详解,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • tk-mybatis整合springBoot使用两个数据源的方法

    tk-mybatis整合springBoot使用两个数据源的方法

    单纯的使用mybaits进行多数据配置网上资料很多,但是关于tk-mybaits多数据源配置没有相关材料,本文就详细的介绍一下如何使用,感兴趣的可以了解一下
    2021-12-12
  • Java基础篇之serialVersionUID用法及注意事项详解

    Java基础篇之serialVersionUID用法及注意事项详解

    这篇文章主要给大家介绍了关于Java基础篇之serialVersionUID用法及注意事项的相关资料,SerialVersionUID属性是用于序列化/反序列化可序列化类的对象的标识符,我们可以用它来记住可序列化类的版本,以验证加载的类和序列化对象是否兼容,需要的朋友可以参考下
    2024-02-02
  • Springboot导入本地jar后 打包依赖无法加入的解决方案

    Springboot导入本地jar后 打包依赖无法加入的解决方案

    这篇文章主要介绍了Springboot导入本地jar后 打包依赖无法加入的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring整合Quartz实现定时任务调度的方法

    Spring整合Quartz实现定时任务调度的方法

    下面小编就为大家带来一篇Spring整合Quartz实现定时任务调度的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Java异常分类以及几种处理机制分析讲解

    Java异常分类以及几种处理机制分析讲解

    在Java的广阔宇宙中,有一群特殊的“超级英雄”,它们在代码世界中穿梭,守护着程序的正常运行——它们就是“异常”,这些英雄们,各司其职,保护着程序免受错误的侵扰,今天,我们将深入这个神秘的世界,全面解析异常的分类,掌握异常的处理机制
    2024-07-07
  • java @interface 注解详解及实例

    java @interface 注解详解及实例

    这篇文章主要介绍了java @interface 注解详解及实例的相关资料,需要的朋友可以参考下
    2017-06-06

最新评论