【Java用法】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

简介: 【Java用法】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

最近在使用阿里编码规约扫描代码(之前一个老的项目)时,发现代码里有爆BLOCKER级别的一个问题,如下图所示:

线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。手动创建线程池,效果会更好哦。

于是乎,我使用new Thread()方式创建了一个线程,之后P3C又爆出了另外一个建议:线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。不要显式创建线程,请使用线程池。

那只能再换一种方式了,使用 ThreadPoolExecutor 线程池方式。如下代码所示,终于不再提示我了。

        HandlerJobRunnable handlerJobRunnable = new HandlerJobRunnable();
        // 构造一个线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 10,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(1),
                new ThreadPoolExecutor.DiscardOldestPolicy());
        threadPoolExecutor.execute(() -> {
            try {
                // 执行 方法
                handlerJobRunnable.run();
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                // 关闭线程池
                threadPoolExecutor.shutdown();
            }
        });

拓展

下面来看一下构造器,了解一下各个参数含义:

顺便总结一下每种线程创建的优缺点:

new Thread 方式

优势:显而易见的线程创建方式

缺点:每次都要new对象,当有大量请求时,数不清new了多少个对象了,如果不及时关闭会导致内存溢出,因此还要考虑线程管理等问题。

Executors工厂创建线程池

newCachedThreadPool:

创建一个可缓存线程池

优点:很灵活,弹性的线程池线程管理,用多少线程给多大的线程池,不用后及时回收,用则新建

缺点:一旦线程无限增长,会导致内存溢出。

newFixedThreadPool :

优点:创建一个固定大小线程池,超出的线程会在队列中等待。

缺点:不支持自定义拒绝策略,大小固定,难以扩展

newScheduledThreadPool :

优点:创建一个固定大小线程池,可以定时或周期性的执行任务。

缺点:任务是单线程方式执行,一旦一个任务失败其他任务也受影响。

newSingleThreadExecutor :

优点:创建一个单线程的线程池,保证线程的顺序执行

缺点:不适合并发。。不懂为什么这种操作要用线程池。。为什么不直接用队列

统一缺点:不支持自定义拒绝策略。

通过ThreadPoolExecutor创建线程池

优点:集上述优点于一身

缺点:目前还没有人说它有什么缺点,因为上述线程池的底层就是通过它来创建的,欢迎大佬留言补充哈。

完结!


相关文章
|
11月前
|
设计模式 缓存 安全
【JUC】(6)带你了解共享模型之 享元和不可变 模型并初步带你了解并发工具 线程池Pool,文章内还有饥饿问题、设计模式之工作线程的解决于实现
JUC专栏第六篇,本文带你了解两个共享模型:享元和不可变 模型,并初步带你了解并发工具 线程池Pool,文章中还有解决饥饿问题、设计模式之工作线程的实现
700 2
|
11月前
|
存储 Java Go
【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举
牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!
423 2
|
11月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
430 98
|
Java
线程池是什么?线程池在实际工作中的应用
总的来说,线程池是一种有效的多线程处理方式,它可以提高系统的性能和稳定性。在实际工作中,我们需要根据任务的特性和系统的硬件能力来合理设置线程池的大小,以达到最佳的效果。
403 18
|
缓存 Java
线程池初始化严禁使用Executors
线程池初始化严禁使用Executors
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
858 60
【Java并发】【线程池】带你从0-1入门线程池
|
安全 Java C#
Unity多线程使用(线程池)
在C#中使用线程池需引用`System.Threading`。创建单个线程时,务必在Unity程序停止前关闭线程(如使用`Thread.Abort()`),否则可能导致崩溃。示例代码展示了如何创建和管理线程,确保在线程中执行任务并在主线程中处理结果。完整代码包括线程池队列、主线程检查及线程安全的操作队列管理,确保多线程操作的稳定性和安全性。
|
Java
【java规则引擎】简单规则的rete网络示意图
一个Fact通过Session添加到规则网络中,如何进行规则匹配的大致过程如下 (1)通过根结点对象从EntryPointNode的Map集合中找到相应的EntryPointNode对象 (2)EntryPointNode对象有一个ObjectTypeNode的Map集合,把fact的class转化...
1305 0
|
11月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
542 1
|
11月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
479 1

热门文章

最新文章