Java多线程环境下SimpleDateFormat类安全转换
一、SimpleDateFormat类
packagestate;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
/**
*SimpleDateFormat类负责日期的转换与格式化
*解决SimpleDateFormat类多线程环境下转换错误问题
*@authorzc
*
*/
publicclassSimpleDateFormatThreadextendsThread{
privateSimpleDateFormatsdf;
privateStringdateString;
publicSimpleDateFormatThread(SimpleDateFormatsdf,StringdateString){
super();
this.sdf=sdf;
this.dateString=dateString;
}
@Override
publicvoidrun(){
try{
//System.out.println(dateString);
//刚开始日期格式设置错误为YYYY-MM-dd
Datedate=DateTools.getSimpleDateFormat("yyyy-MM-dd").parse(dateString);
//System.out.println(date);
StringnewDateString=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(ParseExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args){
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");
String[]dateStringArray=newString[]{
"2020-02-05","2020-02-06","2020-02-07","2020-02-08"
};
SimpleDateFormatThread[]threadArray=newSimpleDateFormatThread[4];
for(inti=0;i<4;i++){
threadArray[i]=newSimpleDateFormatThread(sdf,dateStringArray[i]);
}
for(inti=0;i<4;i++){
threadArray[i].start();
}
}
}
classDateTools{
//ThreadLocal能使线程绑定到指定的对象
privatestaticThreadLocalt=newThreadLocal();
publicstaticSimpleDateFormatgetSimpleDateFormat(StringdatePattern){
SimpleDateFormatsdf=null;
sdf=t.get();
if(sdf==null){
sdf=newSimpleDateFormat(datePattern);
t.set(sdf);
}
returnsdf;
}
}
二、线程状态和线程组
(2)线程5状态
//NEW尚未启动的线程
//RUNNABLEJava虚拟机中执行的线程
//TERMINATED已经退出的线程
//BLOCKED阻塞受监视的线程
//WAITING无限等待另一个线程
//TIMED_WAITING等待另一个线程指定时间
packagestate;
/**
*线程中状态和线程组
*@authorzc
*
*/
publicclassMyThreadextendsThread{
//NEW
//RUNNABLE
//TERMINATED
//BLOCKED
//WAITING
//TIMED_WAITING
publicMyThread(){
System.out.println("构造方法中的状态:"+Thread.currentThread().getState());
}
@Override
publicvoidrun(){
System.out.println("run方法中的状态:"+Thread.currentThread().getState());
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args){
MyThreadmyThread=newMyThread();
System.out.println("main方法中的状态1"+myThread.getState());
Threadt1=newThread();
Threadt2=newThread();
ThreadGroupgroup=newThreadGroup("左氏线程组");
Threadt3=newThread(group,t1);
Threadt4=newThread(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(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。