Java传统的时间格式化的线程安全问题

xiaoxiao2021-02-28  69

以下代码会报错:

package com.expgiga.Java8; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.*; /** * 测试传统时间格式化的线程安全问题 */ public class TestSimpleDateFormat { public static void main(String[] args) throws ExecutionException, InterruptedException { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Callable<Date> task = new Callable<Date>() { @Override public Date call() throws Exception { return sdf.parse("20170806"); } }; ExecutorService pool = Executors.newFixedThreadPool(10); List<Future<Date>> results = new ArrayList<>(); for (int i = 0; i < 10; i++) { results.add(pool.submit(task)); } for (Future<Date> future : results) { System.out.println(future.get()); } } }

Java8之前的解决方法:

package com.expgiga.Java8; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * */ public class DateFormatThreadLocal { 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); } }

package com.expgiga.Java8; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.*; /** * 测试传统时间格式化的线程安全问题 */ public class TestSimpleDateFormat { public static void main(String[] args) throws ExecutionException, InterruptedException { // SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Callable<Date> task = new Callable<Date>() { @Override public Date call() throws Exception { // return sdf.parse("20170806"); return DateFormatThreadLocal.convert("20170805"); } }; ExecutorService pool = Executors.newFixedThreadPool(10); List<Future<Date>> results = new ArrayList<>(); for (int i = 0; i < 10; i++) { results.add(pool.submit(task)); } for (Future<Date> future : results) { System.out.println(future.get()); } pool.shutdown(); } }

Java8的解决方法:

package com.expgiga.Java8; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.*; /** * 测试传统时间格式化的线程安全问题 */ public class TestSimpleDateFormat { public static void main(String[] args) throws ExecutionException, InterruptedException { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd"); Callable<LocalDate> task = new Callable<LocalDate>() { @Override public LocalDate call() throws Exception { return LocalDate.parse("20170806", dtf); } }; ExecutorService pool = Executors.newFixedThreadPool(10); List<Future<LocalDate>> results = new ArrayList<>(); for (int i = 0; i < 10; i++) { results.add(pool.submit(task)); } for (Future<LocalDate> future : results) { System.out.println(future.get()); } pool.shutdown(); } }

转载请注明原文地址: https://www.6miu.com/read-55130.html

最新回复(0)