上海莫尔丽信息科技有限公司 > 产品展示 >

Java之SimpleDateFormat
发布于2025-02-19 17:37 文章作者:芷雪
正在多线程境况停,当多个线程共时应用相反的SimpleDateFormat对于象(如static化妆)的话,如移用format办法时,多个线程会共时移用calender.setTime办法,致使time被此外线程修正,因而线程是担心齐的。
SimpleDateFormat类里面有1个Calendar对于象援用,它用去贮存战那个SimpleDateFormat相干的日期疑息,比方sdf.parse(dateStr),sdf.format(date) 诸如许类的办法参数传进的日期相干String,Date等等, 皆是接由Calendar援用去贮存的.如许便会致使1个题目,若是您的SimpleDateFormat是个static的, 那末多个thread 之间便会同享那个SimpleDateFormat,共时也是同享那个Calendar援用。单例、多线程、又有成员变量(那个变量正在办法中是能够修正的),正在下并收的环境停,简单呈现幻读成员变量的征象,故道SimpleDateFormat是线程担心齐的对于象。
importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassDataFormatTestextendsThread{privatestaticSimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");privateStringname;privateStringdateStr;publicDataFormatTest(Stringname,StringdateStr){this.name=name;this.dateStr=dateStr;}@Overridepublicvoidrun(){try{Datedate=sdf.parse(dateStr);System.out.println(name+":date:"+date);}catch(Exceptione){e.printStackTrace();}}publicstaticvoidmain(String[]args)throwsInterruptedException{ExecutorServiceexecutorService=Executors.newFixedThreadPool(3);executorService.execute(newDataFormatTest("A----->","2022-02-01"));//Thread.sleep(100);executorService.execute(newDataFormatTest("B----->","2022-02-31"));executorService.shutdown();}}机械够美,屡屡运转皆是缺陷:
java.lang.NumberFormatException:multiplepointsatsun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1890)atsun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)atjava.lang.Double.parseDouble(Double.java:538)atjava.text.DigitList.getDouble(DigitList.java:169)atjava.text.DecimalFormat.parse(DecimalFormat.java:2056)atjava.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869)atjava.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514)atjava.text.DateFormat.parse(DateFormat.java:364)atcom.test.DataFormatTest.run(DataFormatTest.java:23)atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)atjava.lang.Thread.run(Thread.java:745)假设把睡眠时候注解来失落,原因没有再生存多线程并提问题,顺序寻常运转。
处理
1:将SimpleDateFormat界说成部分变量。
2:办法添共步锁synchronized,正在统一时辰,只要1个线程能够施行类中的某个办法。
3:应用ThreadLocal:每一个线程具有本身的SimpleDateFormat对于象。
4:应用DateTimeFormatter取代SimpleDateFormat。
DateTimeFormatter应用示例,多线程没有会有题目
importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassDataFormatTest2extendsThread{privatestaticDateTimeFormatterdtf=DateTimeFormatter.ofPattern("yyyy/MM/ddHH:mm:ss");privatestaticDateTimeFormatterdtf2=DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss");privateStringname;privateStringdateStr;publicDataFormatTest2(Stringname,StringdateStr){this.name=name;this.dateStr=dateStr;}@Overridepublicvoidrun(){try{//剖析为日期LocalDateTimelocalDateTime=LocalDateTime.parse(dateStr,dtf);//花样化日期System.out.println(name+":date:"+localDateTime.format(dtf));}catch(Exceptione){e.printStackTrace();}}publicstaticvoidmain(String[]args)throwsInterruptedException{ExecutorServiceexecutorService=Executors.newFixedThreadPool(3);executorService.execute(newDataFormatTest2("A----->","2022/02/0215:23:46"));executorService.execute(newDataFormatTest2("B----->","2022/02/2215:23:46"));executorService.shutdown();}}始初化1个LocalDateTime对于象
ObtainsaninstanceofLocalDateTimefromyear,month,day,hour,minute,secondandnanosecond.ThisreturnsaLocalDateTimewiththespecifiedyear,month,day-of-month,hour,minute,secondandnanosecond.Thedaymustbevalidfortheyearandmonth,otherwiseanexceptionwillbethrown.Params:year–theyeartorepresent,fromMIN_YEARtoMAX_YEARmonth–themonth-of-yeartorepresent,from1(January)to12(December)dayOfMonth–theday-of-monthtorepresent,from1to31hour–thehour-of-daytorepresent,from0to23minute–theminute-of-hourtorepresent,from0to59second–thesecond-of-minutetorepresent,from0to59nanoOfSecond–thenano-of-secondtorepresent,from0to999,999,999Returns:thelocaldate-time,notnullThrows:DateTimeException–ifthevalueofanyfieldisoutofrange,oriftheday-of-monthisinvalidforthemonth-yearpublicstaticLocalDateTimeof(intyear,intmonth,intdayOfMonth,inthour,intminute,intsecond,intnanoOfSecond){LocalDatedate=LocalDate.of(year,month,dayOfMonth);LocalTimetime=LocalTime.of(hour,minute,second,nanoOfSecond);returnnewLocalDateTime(date,time);}Date战LocalDateTime对于象互转
//Date转LocalDateTimeDatedate=newDate();LocalDateTimelocalDateTime=LocalDateTime.ofInstant(date.toInstant(),ZoneId.systemDefault());//LocalDateTime转DateZonedDateTimezdt=localDateTime.atZone(ZoneId.systemDefault());date=Date.from(zdt.toInstant());System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss")));END
推举您浏览更多相关于“ SimpleDateFormatThreadLocal线程平安LocalDateTime ”的作品