Die DateFormat -Klasse ist eine nicht -thread -Sicherheitsklasse. Das Javadocs -Dokument erwähnte, dass "Datumsformate nicht synchronisiert werden können. Wir empfehlen, für jeden Thread ein unabhängiges Datumsformat zu erstellen. Wenn mehrere Threads gleichzeitig auf ein Datumsformat zugreifen, müssen synchrone Codeblöcke nach außen hinzugefügt werden."
Der folgende Code zeigt uns, wie DatumFormat in einer Thread -Umgebung verwendet wird, um das Zeichenfolgendatum in das Datumsobjekt umzuwandeln. Es ist effizienter, ein Beispiel zu erstellen, um das Datumsformat zu erhalten, da das System nicht mehrmals Lokalsprachen und Länder erhalten muss.
Öffentliche Klasse DateFormatest {private dateFormat format = new SimpleDateFormat ("yyyymmdd");
Dieser Code ist nicht thread. Wir können es über mehrere Threads aufrufen. Im folgenden Code habe ich einen Thread -Pool mit zwei Threads erstellt und 5 Date Conversion -Aufgaben übermittelt.
Endgültiges DateFormatest t = NEW DATEFORMATTEL (); Fall eines Threads. .out.println (result.get cure);}
Das Betriebsergebnis des Codes ist nicht so, wie wir es uns gewünscht haben, er gibt das richtige Datum aus und manchmal Ausgabefehler (z.
So verwenden Sie die DateFormat -Klasse gleichzeitig
Wir können mehrere Methoden haben, um die DateFormat -Klasse bei Thread -Sicherheit zu verwenden.
1. Synchron
Am einfachsten besteht die Sperrung des DateFormat -Objekts vor der Datumsumwandlung. Mit dieser Methode kann nur ein Thread jeweils auf das DateFormat -Objekt zugreifen, während andere Threads nur warten können.
Public date convert (String Quelle) löst ParseException {synchronisiert (Format) {Datum d = format.pars (Quelle);
2. Verwenden Sie ThreadLocal
Eine andere Methode besteht darin, die ThreadLocal -Variable zu verwenden, um das DateFormat -Objekt aufzunehmen, was bedeutet, dass jeder Thread eine Kopie hat, die zu seinen eigenen gehört und nicht darauf warten muss, dass andere Threads sie freigeben. Diese Methode ist effizienter als die Verwendung von Synchronblöcken.
Public class dateFormatest {private statische endgültige ThreadLocal <df = new ThreadLocal <DateFormat> () {{@Override Protected DateFormat () RETCORE NEW SimpleDateFormat ("yyyymmdd");}}; Datum d = df.get ().
3. Joda-Zeit
Joda-Time ist ein großartiges Open-Source-JDK-Datum und eine Kalender-API-Alternative.
Org.joda.time.datetime; konvertieren (String Source) {DateTime d = fmt.Parsedatetime (Quelle);