一、传统使用方式存在安全性问题
针对DateFormat
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(10);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Callable<Date> task = new Callable<Date>() {
@Override
public Date call() throws Exception {
return df.parse("2021-03-08");
}
};
List<Future<Date>> list = new ArrayList<>();
for(int i = 0; i < 10; i++) {
Future<Date> submit = pool.submit(task);
list.add(submit);
}
for(Future<Date> future : list) {
System.out.println(future.get());
}
pool.shutdown();
}
二、解决方法一
使用ThreadLocal加锁
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(10);
Callable<Date> task = new Callable<Date>() {
@Override
public Date call() throws Exception {
return DateFormatThreadLocal.convert("2021-03-08");
}
};
List<Future<Date>> list = new ArrayList<>();
for(int i = 0; i < 10; i++) {
Future<Date> submit = pool.submit(task);
list.add(submit);
}
for(Future<Date> future : list) {
System.out.println(future.get());
}
pool.shutdown();
}
三、解决方法二
使用java8新的日期api DateTimeFormatter
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(10);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
Callable<LocalDate> task = new Callable<LocalDate>() {
@Override
public LocalDate call() throws Exception {
return LocalDate.parse("2021-03-08", dtf);
}
};
List<Future<LocalDate>> list = new ArrayList<>();
for(int i = 0; i < 10; i++) {
Future<LocalDate> submit = pool.submit(task);
list.add(submit);
}
for(Future<LocalDate> future : list) {
System.out.println(future.get());
}
pool.shutdown();
}
showtooltip
|