1、Java8之前日期的痛点

1、构造年的日期需传入year-1900

2、每周的日期从周一开始,不符合各国用户习惯

3、 TimeZone提供时区支持但不好用,且线程不安全

4、日期格式化规划混乱,不应该在java.text包中

2、Java8中的改变

1、日期规划到了同一个包中:java.time.*

2、日期表示很灵活,可读性高

3、解决了线程安全问题

3、线程安全问题体现在哪里?

参见TestSimpleDateFormat

传统方式如何解决?

通过ThreadLocal

4、源码

TestSimpleDateFormat

package com.atguigu.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.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

public class TestSimpleDateFormat {

public static void main(String[] args) throws Exception {

/*SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

Callable task = new Callable() {

@Override

public Date call() throws Exception {

return sdf.parse("20161121");

}

};

ExecutorService pool = Executors.newFixedThreadPool(10);

List> results = new ArrayList<>();

for (int i = 0; i < 10; i++) {

results.add(pool.submit(task));

}

for (Future future : results) {

System.out.println(future.get());

}

pool.shutdown();*/

//解决多线程安全问题

/*Callable task = new Callable() {

@Override

public Date call() throws Exception {

return DateFormatThreadLocal.convert("20161121");

}

};

ExecutorService pool = Executors.newFixedThreadPool(10);

List> results = new ArrayList<>();

for (int i = 0; i < 10; i++) {

results.add(pool.submit(task));

}

for (Future future : results) {

System.out.println(future.get());

}

pool.shutdown();*/

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");

Callable task = new Callable() {

@Override

public LocalDate call() throws Exception {

LocalDate ld = LocalDate.parse("20161121", dtf);

return ld;

}

};

ExecutorService pool = Executors.newFixedThreadPool(10);

List> results = new ArrayList<>();

for (int i = 0; i < 10; i++) {

results.add(pool.submit(task));

}

for (Future future : results) {

System.out.println(future.get());

}

pool.shutdown();

}

}

DateFormatThreadLocal

package com.atguigu.java8;

import java.text.DateFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

public class DateFormatThreadLocal {

private static final ThreadLocal df = new ThreadLocal(){

protected DateFormat initialValue(){

return new SimpleDateFormat("yyyyMMdd");

}

};

public static final Date convert(String source) throws ParseException{

return df.get().parse(source);

}

}

java8 function 多线程安全_Java8新特性_传统时间格式化的线程安全问题相关推荐

  1. java8 stream 做累加_Java8新特性之Stream(上)|乐字节

    上次给大家介绍了Java8新特性之方法引用,大家可以点击回顾下.接下来小乐继续给大家带来Java8新特性之Stream ,流是Java8最重要的内容,小乐准备分上下两部分介绍,今天是上部. 5.1.什 ...

  2. java8 lambda map排序_Java8新特性第3章(Stream API)

    转载请注明出处:https://zhuanlan.zhihu.com/p/20540202 Stream作为Java8的新特性之一,他与Java IO包中的InputStream和OutputStre ...

  3. java8 list切片_Java8新特性_创建 Stream、流筛选与切片

    package com.atguigu.java8; import java.util.ArrayList; import java.util.Arrays; import java.util.Ite ...

  4. java8 重复注解_Java8新特性_重复注解与类型注解

    1.总结 1.忘记注解上该写什么时,可以随意写一个注解然后点击进去参考.复制 2.默认情况下不支持重复注解,需要定义容器 3.标注注解为@Repeatable 4.若需要获取注解的值,可以通过反射获取 ...

  5. java+串行和并行的区别_Java8新特性_并行流与串行流

    1.Java8中forkjoin框架使用更加简单了 1.7中的ForkJoin框架编码复杂且容易出错,而8中的编码则十分简单 JDK1.7时开发者需要自定义计算类,如 package com.atgu ...

  6. java8新特性_乐字节-Java8新特性-函数式接口

    上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...

  7. java8新特性_Java8新特性之Date API|乐字节

    大家好,我是乐字节的小乐,上篇文章讲述了<Java8新特性之Optional>,接下来,小乐将接着讲述Java8新特性之Date API 2019日历 Java8之Date API Jav ...

  8. java8新特性_乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

  9. java8 stream遍历_Java8新特性:Stream流详解

    1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...

  10. java8遍历数组_java8新特性,使用流遍历集合

    在这篇"Java 8新特性教程"系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章"遍历.过 ...

最新文章

  1. 剑指offer: 面试题03. 数组中重复的数字
  2. 如何让插件代码同时兼容ats 5.x和ats 6.x的方法
  3. javascript 随机点名
  4. 机房收费--修改密码
  5. ecshop php5.4以上版本错误之preg_replace 替换成 preg_replace_callback
  6. 头条45K的推荐算法工程师,需要具备怎样的技能
  7. 学习笔记(31):Python网络编程并发编程-定时器
  8. docker搭建sonar服务
  9. WPS制作甘特图实操(带图超详细)
  10. 2021-4-22-Python自动化31期-day01作业答案
  11. 腾讯云大学大咖分享 | 自然语言处理技术(NLP)究竟能做些什么?
  12. c语言勾股数编程,C++勾股数公式讲解
  13. 4个有助于保护网站免受劫持的方法
  14. 竖直的ViewPager,上下滑动的ViewPager,VerticalViewPager ;
  15. Pulsar 社区周报|2021-07-12 ~ 2021-07-18
  16. 物联网智能家居需要服务器吗,智能家居设备常见的两种配网/联网方式
  17. 考研数据结构之查找(9.8)——练习题之使用散列函数H(k)= 3k mod 11并采用链地址法处理冲突并构造散列表及设计散列表的完整算法(C表示)
  18. FCS阅读笔记:良好的编程习惯
  19. [RK3128][Android 6.0] u-blox GPS芯片 MAX-7Q调试记录
  20. 一个月上3天班,年薪100万,你来不来!

热门文章

  1. 三周第二次课(4月3日)
  2. 20155226实验四
  3. ubuntu下安装php的curl扩展
  4. HCIE-Security Day18:防火墙用户管理(一)上网用户+本地认证(portal认证)
  5. HCIE-RS面试--STP选举原理,状态机和接口角色
  6. 使用CocosStudioV3.10场景导入Cocos2d-xV3.17.2
  7. python3 鼠标定位输入及其点击实例
  8. MySQL使用小技巧(二)——MySQL忘记密码怎么办
  9. 性能测试二八原则,响应时间2/5/8原则
  10. 使用DaemonSet+Taint/Tolerations+NodeSelector部署Nginx Ingress Controller