哈喽,大家好,我是了不起。
阿里作为国内Java使用最多的大厂,他出版了一部《阿里巴巴Java开发手册》,不知道大家看过没,没有看过的话,建议大家看看。
对于我们编程养成良好的习惯还是很有帮助的,最近我在看到并发这一规约的时候,他们就明确了一点:线程池不允许使用 Executors来创建。
在多线程编程中,线程池是一种重要的资源管理工具,用于提高程序效率和降低资源消耗。
Java通过java.util.concurrent包提供了丰富的线程池管理工具,其中Executors类是创建线程池的常用工具。
然而,像阿里巴巴这样的大型技术公司却建议开发者避免使用Executors来创建线程池。为什么会有这样的建议呢?
图片
Executors类提供了几种快捷方法来创建不同类型的线程池,例如newFixedThreadPool、newCachedThreadPool和newSingleThreadExecutor等。这些方法虽然使用方便,但存在以下几个问题:
Executors使用的默认线程工厂创建的线程都是非守护线程,且没有设置线程名称和优先级。这在某些应用场景中可能不是最佳选择。
某些由Executors创建的线程池,如newCachedThreadPool,使用了无限制的任务队列。这意味着如果任务提交速度超过线程处理速度,会导致内存溢出风险。
使用Executors快捷方法创建的线程池隐藏了许多重要的配置细节,比如线程数量和任务队列类型,这降低了配置的灵活性和透明度。
鉴于上述问题,阿里巴巴在其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<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 来创建一个自定义的线程池。以下是关键配置的说明:
创建线程池后,通过 execute 方法提交任务。最后,使用 shutdown 方法来关闭线程池,以释放资源。
本文链接:http://www.28at.com/showinfo-26-56555-0.html为什么阿里建议你不要使用Executors来创建线程池?
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 性能篇:字符串性能优化不容小觑
下一篇: Python的神奇算术,用代码轻松求和