ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaSE 之 传统日期格式化的线程问题

2020-04-16 13:39:17  阅读:192  来源: 互联网

标签:格式化 list future 线程 Date new JavaSE public pool


需求:让多线程同时去解析日期

错误示范

public class Test1 {
	@Test
	public void test01() throws Exception {

		//格式化日期类
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		//任务类:用于解析成Date对象
		Callable<Date> task = new Callable<Date>() {
			@Override
			public Date call() throws Exception {
				return sdf.parse("20200123");
			}
		};
		//Date解析结果的集合
		List<Future<Date>> list = new ArrayList<>();
		//线程池
		ExecutorService pool = Executors.newFixedThreadPool(10);
		for (int i = 1; i <= 10; i++) {
			Future<Date> future = pool.submit(task);
			list.add(future);
		}
		//打印结果
		for (Future<Date> future : list) {
			System.out.println(future.get());
		}
		//关闭线程池
		pool.shutdown();
	}
}

正确示范

public class Test1 {
	@Test
	public void test01() throws Exception {

		//任务类:用于解析成Date对象
		Callable<Date> task = new Callable<Date>() {
			@Override
			public Date call() throws Exception {
				return SimpleDateFormatThreadLocal.convert("20200123");
			}
		};

		//Date解析结果的集合
		List<Future<Date>> list = new ArrayList<>();

		//线程池
		ExecutorService pool = Executors.newFixedThreadPool(10);
		for (int i = 1; i <= 10; i++) {
			Future<Date> future = pool.submit(task);
			list.add(future);
		}
		//打印结果
		for (Future<Date> future : list) {
			System.out.println(future.get());
		}

		//关闭线程池
		pool.shutdown();
	}
}
class SimpleDateFormatThreadLocal{

	private static final ThreadLocal<SimpleDateFormat> local = new ThreadLocal<SimpleDateFormat>(){
		//重写父类的方法:返回此线程局部变量的当前线程的“初始值”。 
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat("yyyyMMdd");
		}
	};
	
	public static Date convert(String str) throws ParseException{
		SimpleDateFormat sdf = local.get();
		Date date = sdf.parse(str);
		return date;
	}
}

JDK1.8后 正确示范

public class Test1 {
	@Test
	public void test01() throws Exception {

		//格式化日期类
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
		
		//任务类:用于解析成Date对象
		Callable<LocalDate> task = new Callable<LocalDate>() {
			@Override
			public LocalDate call() throws Exception {
				return LocalDate.parse("20200123",dtf);
			}
		};
		//Date解析结果的集合
		List<Future<LocalDate>> list = new ArrayList<>();
		//线程池
		ExecutorService pool = Executors.newFixedThreadPool(10);
		for (int i = 1; i <= 10; i++) {
			Future<LocalDate> future = pool.submit(task);
			list.add(future);
		}
		//打印结果
		for (Future<LocalDate> future : list) {
			System.out.println(future.get());
		}
		//关闭线程池
		pool.shutdown();
	}
}

标签:格式化,list,future,线程,Date,new,JavaSE,public,pool
来源: https://blog.csdn.net/hhy1445584980/article/details/105513648

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有