文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

为什么阿里建议你不要使用Executors来创建线程池?

2024-11-30 03:26

关注

阿里作为国内Java使用最多的大厂,他出版了一部《阿里巴巴Java开发手册》,不知道大家看过没,没有看过的话,建议大家看看。

对于我们编程养成良好的习惯还是很有帮助的,最近我在看到并发这一规约的时候,他们就明确了一点:线程池不允许使用 Executors来创建。

在多线程编程中,线程池是一种重要的资源管理工具,用于提高程序效率和降低资源消耗。

Java通过java.util.concurrent包提供了丰富的线程池管理工具,其中Executors类是创建线程池的常用工具。

然而,像阿里巴巴这样的大型技术公司却建议开发者避免使用Executors来创建线程池。为什么会有这样的建议呢?

1、文档出处

图片

2、Executors类的问题

Executors类提供了几种快捷方法来创建不同类型的线程池,例如newFixedThreadPool、newCachedThreadPool和newSingleThreadExecutor等。这些方法虽然使用方便,但存在以下几个问题:

1.1 默认线程工厂的局限性

Executors使用的默认线程工厂创建的线程都是非守护线程,且没有设置线程名称和优先级。这在某些应用场景中可能不是最佳选择。

1.2 无限制的任务队列

某些由Executors创建的线程池,如newCachedThreadPool,使用了无限制的任务队列。这意味着如果任务提交速度超过线程处理速度,会导致内存溢出风险。

1.3 缺乏灵活性和透明度

使用Executors快捷方法创建的线程池隐藏了许多重要的配置细节,比如线程数量和任务队列类型,这降低了配置的灵活性和透明度。

3、如何创建线程池呢?

鉴于上述问题,阿里巴巴在其Java开发手册中建议开发者不要使用Executors类的快捷方法创建线程池,

那么我们应该如何创建线程池呢?

答案就是使用:ThreadPoolExecutor。

我们可以看下这个类:

图片

ThreadPoolExecutor构造函数允许开发者自定义线程池的多个参数,包括核心线程数、最大线程数、空闲线程存活时间、任务队列、线程工厂和拒绝策略等。这些自定义的配置可以更好地满足不同的应用需求。

所以,创建高效和可靠的线程池时应考虑以下几点:

下面给出一段最佳实践代码供大家参考:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExample {

    public static void main(String[] args) {
        // 核心线程数
        int corePoolSize = 5;
        // 最大线程数
        int maximumPoolSize = 10;
        // 当线程数大于核心线程数时,多余空闲线程的存活时间
        long keepAliveTime = 5000;
        // 时间单位,这里使用毫秒
        TimeUnit unit = TimeUnit.MILLISECONDS;

        // 任务队列,使用有界队列可以避免资源耗尽的问题
        ArrayBlockingQueue workQueue = new ArrayBlockingQueue<>(100);

        // 创建线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                unit,
                workQueue
        );

        // 示例任务提交
        for (int i = 0; i < 20; i++) {
            int finalI = i;
            executor.execute(() -> {
                System.out.println("Executing task " + finalI + " using thread " + Thread.currentThread().getName());
                try {
                    // 模拟任务执行时间
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        // 关闭线程池
        executor.shutdown();
    }
}

这段代码展示了如何使用 ThreadPoolExecutor 来创建一个自定义的线程池。以下是关键配置的说明:

创建线程池后,通过 execute 方法提交任务。最后,使用 shutdown 方法来关闭线程池,以释放资源。

来源:Java技术指北内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯