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内置锁(synchronized)和显式锁(ReentrantLock)

    深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    这篇文章主要介绍了Java多线程之内置锁(synchronized)和显式锁(ReentrantLock)的深入理解新的和用法,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java 继承原理与用法实例分析

    Java 继承原理与用法实例分析

    这篇文章主要介绍了Java 继承原理与用法,结合实例形式分析了java面向对象程序设计中继承的概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2019-06-06
  • IDEA 创建一个Mybatis Maven项目的方法步骤(图文)

    IDEA 创建一个Mybatis Maven项目的方法步骤(图文)

    这篇文章主要介绍了IDEA 创建一个Mybatis Maven项目的方法步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java Collection集合遍历运行代码实例

    Java Collection集合遍历运行代码实例

    这篇文章主要介绍了Java Collection集合遍历运行代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java.math包下计算浮点数和整数的类的实例

    java.math包下计算浮点数和整数的类的实例

    这篇文章主要介绍了java.math包下计算浮点数和整数的类的实例代码,本文通过使用BigDecimal进行浮点数比较给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • tk-mybatis整合springBoot使用两个数据源的方法

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

    单纯的使用mybaits进行多数据配置网上资料很多,但是关于tk-mybaits多数据源配置没有相关材料,本文就详细的介绍一下如何使用,感兴趣的可以了解一下
    2021-12-12
  • java编译器和JVM的区别

    java编译器和JVM的区别

    在本篇文章里小编给大家整理的是一篇关于java编译器和JVM的区别的相关内容,有兴趣的朋友们可以学习下。
    2020-12-12
  • Java程序图形用户界面设计之容器JFrame

    Java程序图形用户界面设计之容器JFrame

    图形界面(简称GUI)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受,本篇精讲Java语言中关于图形用户界面的基本容器JFrame
    2022-02-02
  • Java基础之FastJson详解

    Java基础之FastJson详解

    今天给大家复习Java基础FastJson,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Java实战之酒店人事管理系统的实现

    Java实战之酒店人事管理系统的实现

    这篇文章主要介绍了如何用Java实现酒店人事管理系统,文中采用的技术有:JSP、Spring、SpringMVC、MyBatis等,感兴趣的小伙伴可以学习一下
    2022-03-03

最新评论