Java传统的时间格式化的线程安全问题
2017-08-06 16:19
344 查看
以下代码会报错:
Java8之前的解决方法:
Java8的解决方法:
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(); } }
相关文章推荐
- Java8新特性-014-传统时间API的线程安全问题
- JAVA复习资料-关于SimpleDateFormat安全的时间格式化线程安全问题
- java线程安全问题之静态变量、实例变量、局部变量
- java线程安全问题之静态变量、实例变量、局部变量
- 深入理解Java:SimpleDateFormat安全的时间格式化
- 关于SimpleDateFormat安全的时间格式化线程安全问题
- Java多线程技术初识——3. 线程安全问题
- java格式化时间问题
- Java中线程的安全问题
- java线程的同步安全问题三种解决办法
- java线程冲突问题——不安全的线程例子
- java线程安全问题笔记
- Java线程安全问题
- 静态变量、实例变量、局部变量在多线程环境下的线程安全问题 java 多线程
- java线程安全问题之静态变量、实例变量、局部变量
- 关于Java语言中的线程安全问题
- JAVA中关于线程通信安全问题
- 深入理解Java:SimpleDateFormat安全的时间格式化
- javaweb-07-Servlet的线程安全问题
- java 多线程(线程间通信-解决安全问题)