A classe DateFormat é uma classe de segurança não thread. O documento Javadocs mencionou que "os formatos de data não podem ser sincronizados. Recomendamos criar um formato de data independente para cada thread. Se vários threads acessarem um formato de data ao mesmo tempo, isso precisa adicionar blocos de código síncrono ao exterior".
O código a seguir nos mostra como usar o DateFormat em um ambiente de thread para converter a data da string no objeto Data. Criar um exemplo para obter o formato da data é mais eficiente, porque o sistema não precisa obter idiomas e países locais muitas vezes.
Classe pública DateFormatTest {Format Final Format Private = New SimpleDateFormat ("AUMYYYMMDD");
Este código não é threaded. Podemos chamá -lo através de vários threads. No código a seguir, criei um pool de threads com dois threads e enviei 5 tarefas de conversão de data.
Data final FormatTest T = new DateFormatTest (); Caso de um thread. .out.println (resultado.get cure);}
O resultado da operação do código não é como desejávamos às vezes, ele produz a data correta e, às vezes, erros de saída (como .Sat 31 de julho 00:00:00 BST 2012), às vezes até lançando NumberFormatexception!
Como usar a classe DateFormat simultaneamente
Podemos ter vários métodos para usar a classe DateFormat quando a segurança do thread.
1. Síncrono
A maneira mais fácil é bloquear o objeto DateFormat antes da conversão da data. Este método permite que apenas um thread acesse o objeto DateFormat por vez, enquanto outros threads só podem esperar.
Public Data Convert (String Source) lança parseException {Sincronizada (formato) {Data D = format.pars (fonte);
2. Use Threadlocal
Outro método é usar a variável Threadlocal para acomodar o objeto DateFormat, o que significa que cada encadeamento possui uma cópia que pertence à sua própria e não precisa esperar que outros threads o liberem. Este método será mais eficiente do que o uso de blocos síncronos.
Classe pública DateFormatTest {private Static Final Threadlocal <df = new Threadlocal <DeeFormat> () {{@Override Protected DateFormat () () Retornar New SimpleDateFormat ("Yyyyymmdd");}}; Data D = df.get ().
3. Joda-time
O Joda-Time é uma ótima data de JDK de código aberto e uma alternativa da API do calendário.
Importação de org.joda.time.dateTime; converter (fonte de string) {datetime d = fmt.parseDateTime (fonte);