La classe DateFormat est une classe de sécurité non thread. Le document Javadocs a mentionné que "les formats de date ne peuvent pas être synchronisés. Nous vous recommandons de créer un format de date indépendant pour chaque thread. Si plusieurs threads accèdent à un format de date en même temps, cela doit ajouter des blocs de code synchrones à l'extérieur."
Le code suivant nous montre comment utiliser DateFormat dans un environnement de thread pour convertir la date de chaîne en l'objet Date. La création d'un exemple pour obtenir le format de date est plus efficace, car le système n'a pas besoin d'obtenir des langues et des pays locaux à plusieurs reprises.
Classe publique DateFormAtSt {private finalFormat Format = new SimpledateFormat ("yyyymmdd"); Public Date Convert (Source de chaîne) lance ParseException {d ate d = format.parse (source);}}}
Ce code est non thread. Nous pouvons l'appeler via plusieurs threads. Dans le code suivant, j'ai créé un pool de threads avec deux threads et j'ai soumis 5 tâches de conversion de date.
Final DateFormatTest t = new DateFormatTest (); cas de thread. .out.println (result.get Cure);}
Le résultat de l'opération du code n'est pas comme nous le voulions parfois, il sort la date correcte, et parfois des erreurs de sortie (telles que .sat 31 juillet 00:00:00 BST 2012), parfois même en lançant NumberFormatexception!
Comment utiliser la classe DateFormat simultanément
Nous pouvons avoir plusieurs méthodes pour utiliser la classe DateFormat lorsque la sécurité des threads.
1. Synchrone
Le moyen le plus simple consiste à verrouiller l'objet DateFormat avant la conversion de date. Cette méthode ne permet qu'un seul thread d'accéder à l'objet DateFormat à la fois, tandis que d'autres threads ne peuvent qu'attendre.
Date publique Convert (Source de chaîne) lève ParseException {synchronisé (format) {date d = format.Pars (source);
2. Utilisez du threadlocal
Une autre méthode consiste à utiliser la variable ThreadLocal pour s'adapter à l'objet DateFormat, ce qui signifie que chaque thread a une copie qui appartient à la sienne, et pas besoin d'attendre que d'autres threads le divulguent. Cette méthode sera plus efficace que d'utiliser des blocs synchrones.
Classe publique DateFormatTest {private static final ThreadLocal <df = new ThreadLocal <AteFormat> () {{@Override Protected DateFormat () () RETOUR NOUVEAU IMPLEDATEFORMAT ("Yyyymmdd");}}; Date D = DF.get ().
3. Joda-time
JODA-TIME est une excellente date JDK open source et une alternative API Calendar.
Import org.joda.time.DateTime; convert (String Source) {DateTime d = fmt.parsedateTime (source);