Java多執行緒環境下SimpleDateFormat類安全轉換
阿新 • • 發佈:2020-02-10
一、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(); } } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。