ThreadLocal不好用?那是你没用对!(3)

简介: ThreadLocal不好用?那是你没用对!(3)

③ 1000个线程格式化


然而当我们将线程的数量从 10 个变成 1000 个的时候,我们就不能单纯的使用 for 循环来创建 1000 个线程的方式来解决问题了,因为这样频繁的新建和销毁线程会造成大量的系统开销和线程过度争抢 CPU 资源的问题。


所以经过一番思考后,我们决定使用线程池来执行这 1000 次的任务,因为线程池可以复用线程资源,无需频繁的新建和销毁线程,也可以通过控制线程池中线程的数量来避免过多线程所导致的 CPU 资源过度争抢和线程频繁切换所造成的性能问题,而且我们可以将 SimpleDateFormat 提升为全局变量,从而避免每次执行都要新建 SimpleDateFormat 的问题,于是我们写下了这样的代码:


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
publicclass App {
    // 时间格式化对象
    privatestatic SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");
    public static void main(String[] args) throws InterruptedException {
        // 创建线程池执行任务
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 60,
                TimeUnit.SECONDS, new LinkedBlockingQueue<>(1000));
        for (int i = 0; i < 1000; i++) {
            int finalI = i;
            // 执行任务
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    // 得到时间对象
                    Date date = new Date(finalI * 1000);
                    // 执行时间格式化
                    formatAndPrint(date);
                }
            });
        }
        // 线程池执行完任务之后关闭
        threadPool.shutdown();
    }
    /**
     * 格式化并打印时间
     * @param date 时间对象
     */
    private static void formatAndPrint(Date date) {
        // 执行格式化
        String result = simpleDateFormat.format(date);
        // 打印最终结果
        System.out.println("时间:" + result);
    }
}


以上程序的执行结果为:


微信图片_20220120184341.jpg


当我们怀着无比喜悦的心情去运行程序的时候,却发现意外发生了,这样写代码竟然会出现线程安全的问题。从上述结果可以看出,程序的打印结果竟然有重复内容的,正确的情况应该是没有重复的时间才对。


PS:所谓的线程安全问题是指:在多线程的执行中,程序的执行结果与预期结果不相符的情况

相关文章
|
Java
intellij idea使用c:foreach标签的方法
我们都知道在myeclipse的jsp中想使用c:foreach标签只需要引入: &lt;%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt; 但是在idea中这样使用是不行的 因为默认的idea中是没有这个标签的 如果需要使用此标签需要引入对应的工具 地址: http://downloa
4319 0
|
安全 Nacos 数据安全/隐私保护
升级指南:从Nacos 1.3.0 到 2.3.0,并兼容 Seata 的鉴权配置
本文详细介绍了如何在微服务环境下从 Nacos 1.3.0 升级到 2.3.0,并确保 Seata 各版本的兼容性。作者小米分享了升级过程中的关键步骤,包括备份配置、更新鉴权信息及验证测试等,并解答了常见问题。通过这些步骤,可以帮助读者顺利完成升级并提高系统的安全性与一致性。
329 8
升级指南:从Nacos 1.3.0 到 2.3.0,并兼容 Seata 的鉴权配置
|
监控 安全 网络安全
探索零信任安全架构:一种现代网络安全策略
零信任安全架构是一种旨在应对现代复杂网络威胁的新型网络安全策略。它的核心理念是“永不信任,始终验证”,即无论内部还是外部的访问请求都需要经过严格的身份验证和授权。在本文中,我们将深入探讨零信任安全架构的基本概念、主要组件及其在实际应用中的优势和挑战。
537 27
|
消息中间件 Java Nacos
SpringCloud概述
本节笔者介绍了SpringCloud诞生的由来,以及目前国内主要流行的SpringCloud Alibaba与SpringCloud的关系,同时针对SpringCloud自身的特点、版本号、依赖关系做了概要论述,这些都是为了接下来的实战打好基础
|
Kubernetes 安全 搜索推荐
在K8S中,二进制与Kubeadm安装有何区别?
在K8S中,二进制与Kubeadm安装有何区别?
|
JavaScript Java 测试技术
基于SpringBoot+Vue的企业资产管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的企业资产管理系统的设计与实现(源码+lw+部署文档+讲解等)
166 4
|
存储 安全 内存技术
地址映射
地址映射
638 0
navicat安装以及破解
navicat安装以及破解
367 0
|
传感器 自动驾驶 算法
基于Apollo 8.0的自动驾驶感知技术:创新与应用
基于Apollo 8.0的自动驾驶感知技术:创新与应用
299 8
|
机器学习/深度学习 算法
分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测
分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测