1、使用线程池创建并发环境解析日期
package com.zh.time; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /** * @desc SimpleDateFormat 线程不安全 * @author zhanh247 */ public class SimpleDateFormatTest { public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); ExecutorService executorService = Executors.newFixedThreadPool(10); try { Callable<Date> callable = new Callable<Date>() { @Override public Date call() throws Exception { return sdf.parse("20180909"); } }; List<Future<Date>> list = new ArrayList<Future<Date>>(); for (int i = 0; i < 10; i++) { list.add(executorService.submit(callable)); } for (Future<Date> future : list) { System.out.println(future.get()); } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } finally { executorService.shutdown(); } } }
2、执行结果如下:
3、线程不安全问题解决方案
package com.zh.time; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * @desc 线程安全 * @author zhanh247 */ public class SimpleDateFormatThreadLocal { private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { protected DateFormat initialValue() { return new SimpleDateFormat("yyyyMMdd"); }; }; public static Date convert(String source) throws ParseException { return df.get().parse(source); } }