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();
 }
 }
}

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

(0)

相关推荐

  • Java中SimpleDateFormat日期格式转换详解及代码示例

    SimpleDateFormat是处理日期格式转换的类. 官方API_1.8关于SimpleDateFormat继承于DateFormate截图: SimpleDateFormat的构造器如下: SimpleDateFormat中的格式定义,常用的用红色框圈出: 中文解释: y : 年 M : 年中的月份 D : 年中的天数 d : 月中的天数 w : 年中的周数 W : 月中的周数 a : 上下/下午 H : 一天中的小时数(0-23) h : 一天中的小时数(0-12) m : 小时中的分钟

  • Java SimpleDateFormat中英文时间格式化转换详解

    SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类.它允许进行格式化(日期 -> 文本).解析(文本 -> 日期)和规范化. SimpleDateFormat使得可以选择任何用户定义的日期-时间格式的模式.但是,仍然建议通过DateFormat中的getTimeInstance.getDateInstance 或 getDateTimeInstance 来创建日期-时间格式器.每一个这样的类方法都能够返回一个以默认格式模式初始化的日期/时间格式器.可以根据需

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

    一.SimpleDateFormat类 package state; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * SimpleDateFormat类负责日期的转换与格式化 * 解决SimpleDateFormat类多线程环境下转换错误问题 * @author zc * */ public class SimpleDateFormatThread e

  • Java多线程环境下死锁模拟

    目录 1.死锁产生的条件 2.模拟多线程环境下死锁的产生 3.死锁的排查 1.死锁产生的条件 互斥:一次只有一个进程可以使用一个资源.其他进程不能访问已分配给其他进程的资源. 不可抢占:不能抢占进程已占有的资源 请求和保持:当一个进程等待其他进程释放资源时,继续占有已经分配的资源 循环等待:存在一个封闭的进程链,使得每个进程至少占有此链中下一个进程所需要的一个资源. 注意:前三个条件都只是死锁存在的必要条件,但不是充分条件.第四个条件是充分条件.以上条件同样适用于线程. 2.模拟多线程环境下死锁

  • Java指令重排在多线程环境下的解决方式

    目录 一.序言 二.问题复原 (一)关联变量 1.结果预测 2.指令重排 (二)new创建对象 1.解析创建过程 2.重排序过程分析 三.应对指令重排 (一)AtomicReference原子类 (二)volatile关键字 四.指令重排的理解 1.指令重排广泛存在 2.多线程环境指令重排 3.synchronized锁与重排序无关 一.序言 指令重排在单线程环境下有利于提高程序的执行效率,不会对程序产生负面影响:在多线程环境下,指令重排会给程序带来意想不到的错误. 本文对多线程指令重排问题进行

  • Java指令重排序在多线程环境下的处理方法

    目录 一.序言 二.问题复原 (一)关联变量 1.结果预测 2.指令重排 (二)new创建对象 1.解析创建过程 2.重排序过程分析 三.应对指令重排 (一)AtomicReference原子类 (二)volatile关键字 1.指令重排广泛存在 2.多线程环境指令重排 3.synchronized锁与重排序无关 四.指令重排的理解 一.序言 指令重排在单线程环境下有利于提高程序的执行效率,不会对程序产生负面影响:在多线程环境下,指令重排会给程序带来意想不到的错误. 本文对多线程指令重排问题进行

  • java多线程加锁以及Condition类的使用实例解析

    这篇文章主要介绍了java多线程加锁以及Condition类的使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 看了网上非常多的运行代码,很多都是重复的再说一件事,可能对于java老鸟来说,理解java的多线程是非常容易的事情,但是对于我这样的菜鸟来说,这个实在有点难,可能是我太菜了,网上重复的陈述对于我理解这个问题一点帮助都没有.所以这里我写下我对于这个问题的理解,目的是为了防止我忘记. 还是从代码实例开始讲起: 代码 import

  • 教你如何使用Java多线程编程LockSupport工具类

    LockSupport类 用于创建锁和其他同步类的基本线程阻塞原语,此类与使用它的每个线程关联一个许可.如果获得许可,将立即返回对park的调用,并在此过程中消耗掉它:否则may会被阻止.调用unpark可使许可证可用(如果尚不可用).(不过与信号量不同,许可证不会累积.最多只能有一个.) 方法park和unpark提供了有效的阻塞和解阻塞线程的方法,这些线程不会遇到导致已弃用的方法Thread.suspend和Thread.resume无法用于以下问题:由于许可,在调用park的一个线程与试图

  • Java多线程之同步工具类CyclicBarrier

    目录 1 CyclicBarrier方法说明 2 CyclicBarrier实例 3 CyclicBarrier源码解析 CyclicBarrier构造函数 await方法 nextGeneration的源码 breakBarrier源码 isBroken方法 reset方法 getNumberWaiting方法 前言: CyclicBarrier是一个同步工具类,它允许一组线程互相等待,直到达到某个公共屏障点.与CountDownLatch不同的是该barrier在释放线程等待后可以重用,所以

  • Java多线程读写锁ReentrantReadWriteLock类详解

    目录 ReentrantReadWriteLock 读读共享 写写互斥 读写互斥 源码分析 写锁的获取与释放 读锁的获取与释放 参考文献 真实的多线程业务开发中,最常用到的逻辑就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务),这样做虽然保证了实例变量的线程安全性,但效率却是非常低下的.所以在JDK中提供了一种读写锁ReentrantReadWriteLock类,使用它可以加快运行效率. 读写锁表示两个锁,一个是读操作相关的锁

  • Linux多线程环境下 关于进程线程终止函数总结

    pthread_kill: pthread_kill与kill有区别,是向线程发送signal.,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数. int pthread_kill(pthread_t thread, int sig); 向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响整个进程,也就是说,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出. pthread

  • webuploader在springMVC+jquery+Java开发环境下的大文件分片上传的实例代码

    注意: 1,webuploader上传组件会和jQuery自带的上传组件冲突,所以不要使用<form>标签中添加上传文件的属性; enctype="multipart/form-data" 2.并且屏蔽ApplicationContext-mvc.xml里面的拦截配置! <!-- 上传拦截,如最大上传值及最小上传值 --> <!--新增加的webuploader上传组件,必须要屏蔽这里的拦截机制 <bean id="multipartRes

随机推荐