คลาส DateFormat เป็นคลาสความปลอดภัยที่ไม่ใช่เธรด เอกสาร Javadocs กล่าวว่า "รูปแบบวันที่ไม่สามารถซิงโครไนซ์ได้เราขอแนะนำให้สร้างรูปแบบวันที่อิสระสำหรับแต่ละเธรดหากหลายเธรดเข้าถึงรูปแบบวันที่ในเวลาเดียวกันสิ่งนี้จำเป็นต้องเพิ่มบล็อกรหัสซิงโครนัสลงในด้านนอก"
รหัสต่อไปนี้แสดงวิธีการใช้ DateFormat ในสภาพแวดล้อมเธรดเพื่อแปลงวันที่สตริงเป็นวัตถุวันที่ การสร้างตัวอย่างเพื่อให้ได้รูปแบบวันที่มีประสิทธิภาพมากขึ้นเนื่องจากระบบไม่จำเป็นต้องได้รับภาษาท้องถิ่นและประเทศหลายครั้ง
Public Class DateFormattest {Private Final DateFormat Format = New SimpledateFormat ("Yyyymmdd");
รหัสนี้ไม่ใช่เธรด เราสามารถเรียกมันผ่านหลายเธรด ในรหัสต่อไปนี้ฉันสร้างพูลเธรดที่มีสองเธรดและส่งงานแปลง 5 วัน
วันที่สุดท้าย t = new DateFormattest (); กรณีของเธรด .out.println (result.get cure);}
ผลการดำเนินงานของรหัสไม่ได้เป็นอย่างที่เราต้องการ-บางครั้งมันส่งออกวันที่ที่ถูกต้องและบางครั้งข้อผิดพลาดการส่งออก (เช่น. sat 31 ก.ค. 00:00:00 BST 2012) บางครั้งถึงกับโยน numberFormatexception!
วิธีการใช้คลาส DateFormat พร้อมกัน
เราสามารถมีหลายวิธีในการใช้คลาส DateFormat เมื่อความปลอดภัยของเธรด
1. ซิงโครนัส
วิธีที่ง่ายที่สุดคือการล็อควัตถุวันที่ก่อนการแปลงวันที่ วิธีนี้อนุญาตให้มีเธรดเพียงหนึ่งเดียวในการเข้าถึงวัตถุ DateFormat ในแต่ละครั้งในขณะที่เธรดอื่น ๆ สามารถรอได้เท่านั้น
การแปลงวันที่สาธารณะ (แหล่งที่มาของสตริง) พ่น ParseException {ซิงโครไนซ์ (รูปแบบ) {วันที่ d = format.pars (แหล่งที่มา);
2. ใช้ Threadlocal
อีกวิธีหนึ่งคือการใช้ตัวแปร ThreadLocal เพื่อรองรับวัตถุ DateFormat ซึ่งหมายความว่าแต่ละเธรดมีสำเนาที่เป็นของตัวเองและไม่จำเป็นต้องรอให้เธรดอื่นปล่อยออกมา วิธีนี้จะมีประสิทธิภาพมากกว่าการใช้บล็อกแบบซิงโครนัส
คลาสสาธารณะ DateFormattest {Private Static Final ThreadLocal <DF = New ThreadLocal <DateFormat> () {{@Override Protected DateFormat () () ส่งคืน SimpleDateFormat ใหม่ ("yyyymmdd");}}; วันที่ d = df.get ()
3. โจดา-เวลา
Joda-Time เป็นวันที่ JDK โอเพ่นซอร์สที่ยอดเยี่ยมและทางเลือก API ปฏิทิน
นำเข้า org.joda.time.datetime; แปลง (แหล่งที่มาของสตริง) {DateTime d = fmt.parsedateTime (แหล่งที่มา);