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:所谓的线程安全问题是指:在多线程的执行中,程序的执行结果与预期结果不相符的情况

相关文章
|
存储 消息中间件 JavaScript
ThreadLocal 你真的用不上吗?
ThreadLocal 你真的用不上吗?
|
存储 缓存 Java
终于弄明白了ThreadLocal
ThreadLocal是Thread的局部变量,用于编多线程程序,对解决多线程程序的并发问题有一定的启示作用。
113 0
终于弄明白了ThreadLocal
J3
|
存储 安全 Java
synchronized解析及锁膨胀过程,面试再也不怕了
synchronized解析及锁膨胀过程,面试再也不怕了
J3
492 0
synchronized解析及锁膨胀过程,面试再也不怕了
|
Java
如何避免忘记清理 ThreadLocal ?
hreadLocal 可以解决“线程安全问题”。 也可以作为上下文暂存数据以备后续步骤获取。 但是 ThreadLocal 用不好的确容易产生故障,因而有些团队不允许使用 ThreadLocal。 最核心的一个原因是很容易忘记清理,在线程池环境下复用导致串环境。 那么,有什么优雅的解法没?本文给出自己的一个解法。
642 0
如何避免忘记清理 ThreadLocal ?
|
Java
ThreadLocal不好用?那是你没用对!(1)
ThreadLocal不好用?那是你没用对!(1)
105 0
ThreadLocal不好用?那是你没用对!(1)
ThreadLocal不好用?那是你没用对!(7)
ThreadLocal不好用?那是你没用对!(7)
70 0
ThreadLocal不好用?那是你没用对!(7)
|
Java
ThreadLocal不好用?那是你没用对!(15)
ThreadLocal不好用?那是你没用对!(15)
96 0
ThreadLocal不好用?那是你没用对!(11)
ThreadLocal不好用?那是你没用对!(11)
90 0
ThreadLocal不好用?那是你没用对!(11)
|
存储 对象存储
ThreadLocal不好用?那是你没用对!(13)
ThreadLocal不好用?那是你没用对!(13)
106 0
ThreadLocal不好用?那是你没用对!(13)
|
安全
ThreadLocal不好用?那是你没用对!(5)
ThreadLocal不好用?那是你没用对!(5)
86 0
ThreadLocal不好用?那是你没用对!(5)