当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2024-01-03 09:12:05 344观看
导读哈喽,大家好,我是了不起。阿里作为国内Java使用最多的大厂,他出版了一部《阿里巴巴Java开发手册》,不知道大家看过没,没有看过的话,建议大家看看。对于我们编程养成良好的习惯还是很有帮助的,最近我在看到并发这一规约的时候

哈喽,大家好,我是了不起。HuT28资讯网——每日最新资讯28at.com

阿里作为国内Java使用最多的大厂,他出版了一部《阿里巴巴Java开发手册》,不知道大家看过没,没有看过的话,建议大家看看。HuT28资讯网——每日最新资讯28at.com

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

在多线程编程中,线程池是一种重要的资源管理工具,用于提高程序效率和降低资源消耗。HuT28资讯网——每日最新资讯28at.com

Java通过java.util.concurrent包提供了丰富的线程池管理工具,其中Executors类是创建线程池的常用工具。HuT28资讯网——每日最新资讯28at.com

然而,像阿里巴巴这样的大型技术公司却建议开发者避免使用Executors来创建线程池。为什么会有这样的建议呢?HuT28资讯网——每日最新资讯28at.com

1、文档出处

图片图片HuT28资讯网——每日最新资讯28at.com

2、Executors类的问题

Executors类提供了几种快捷方法来创建不同类型的线程池,例如newFixedThreadPool、newCachedThreadPool和newSingleThreadExecutor等。这些方法虽然使用方便,但存在以下几个问题:HuT28资讯网——每日最新资讯28at.com

1.1 默认线程工厂的局限性

Executors使用的默认线程工厂创建的线程都是非守护线程,且没有设置线程名称和优先级。这在某些应用场景中可能不是最佳选择。HuT28资讯网——每日最新资讯28at.com

1.2 无限制的任务队列

某些由Executors创建的线程池,如newCachedThreadPool,使用了无限制的任务队列。这意味着如果任务提交速度超过线程处理速度,会导致内存溢出风险。HuT28资讯网——每日最新资讯28at.com

1.3 缺乏灵活性和透明度

使用Executors快捷方法创建的线程池隐藏了许多重要的配置细节,比如线程数量和任务队列类型,这降低了配置的灵活性和透明度。HuT28资讯网——每日最新资讯28at.com

3、如何创建线程池呢?

鉴于上述问题,阿里巴巴在其Java开发手册中建议开发者不要使用Executors类的快捷方法创建线程池,HuT28资讯网——每日最新资讯28at.com

那么我们应该如何创建线程池呢?HuT28资讯网——每日最新资讯28at.com

答案就是使用:ThreadPoolExecutor。HuT28资讯网——每日最新资讯28at.com

我们可以看下这个类:HuT28资讯网——每日最新资讯28at.com

图片图片HuT28资讯网——每日最新资讯28at.com

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

所以,创建高效和可靠的线程池时应考虑以下几点:HuT28资讯网——每日最新资讯28at.com

  • 合理设置线程数量:线程池大小应根据系统资源和需求合理设置。
  • 选择适当的任务队列:根据任务类型和执行策略选择合适的队列类型。
  • 自定义线程工厂:可以设置更有意义的线程名称,方便问题追踪和调试。
  • 合理的拒绝策略:在任务队列满时选择合适的拒绝策略,如AbortPolicy、CallerRunsPolicy等。

下面给出一段最佳实践代码供大家参考:HuT28资讯网——每日最新资讯28at.com

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<Runnable> 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 来创建一个自定义的线程池。以下是关键配置的说明:HuT28资讯网——每日最新资讯28at.com

  • corePoolSize(核心线程数):线程池保持活跃状态的线程数量,即使这些线程处于空闲状态。
  • maximumPoolSize(最大线程数):线程池能够容纳的最大线程数量。
  • keepAliveTime(线程存活时间):当线程数量超过核心线程数时,多余的空闲线程可以存活的时间。
  • unit(时间单位):用于 keepAliveTime 的时间单位。
  • workQueue(任务队列):存储待执行任务的队列。这里使用了 ArrayBlockingQueue 作为有界队列,以避免资源耗尽的风险。

创建线程池后,通过 execute 方法提交任务。最后,使用 shutdown 方法来关闭线程池,以释放资源。HuT28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-56555-0.html为什么阿里建议你不要使用Executors来创建线程池?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 性能篇:字符串性能优化不容小觑

下一篇: Python的神奇算术,用代码轻松求和

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
Top