前言
阿里的Java开发者手册中对于线程池的创建有很多强制性的限制,其中最重要的一条就是:
线程池不允许使用Executors去创建,那我们改如何正确的使用Java线程池技术呢?Java线程池使用场景
Java线程池技术是我们经常会用到的一项技术,例如定时任务、异步数据处理、队列等我们都会用到线程池技术。Java的JUC包有很多API可以让我们创建一个线程池,那这些API我们改如何正确使用呢?为什么在阿里的Java开发者手册中对于线程池的创建有很多强制性的限制?例如,不能使用Excuro来创建线程池。这篇文章将详细为大家介绍Java线程池的几种类型以及如何正确创建线程池。
四种内置线程池
Java JUC包中有四种内置的线程池技术,包括单线程的线程池、固定大小的线程池、可缓存的线程池、定时执行的线程池。
- 1、单线程的线程池(newSingleThreadExecutor)
单线程的线程池中只有一个线程,也就是所有任务都是通过这一个线程来串行执行,保证了执行任务按照提交顺序来执行。如果业务只是涉及到异步执行,可选择该线程池技术。
- 2、固定大小的线程池(newFixedThreadPool)
固定大小的线程池创建的时候限制了线程池中线程的数量。当有新的任务创建的时候,就创建一个新的线程来执行任务。
当线程池中的线程数量达到设定的值的时候,任务开始等待执行,直到有可用的线程。- 3、可缓存的线程池(newCachedThreadPool)
可缓存的线程池不限定线程数量,当有新的任务加入,如果没有可用的线程,那就创建新的线程。线程最大数量取决于操作系统所能创建的最大线程数量。此线程池技术也是项目开发中不被推荐的一种方法,因为如何控制不好任务数量,将会导致大量的线程被创建,影响系统的性能。
- 4、定时执行的线程池(newScheduledThreadPool)
定时执行的线程池支持创建无线数量的线程池,并且线程按照设定的时间周期执行。
四种线程池适用不同的业务场景,我们可以根据业务类型来选择使用。JUC中提供了很多API可以让我们方便的创建以上四种线程池技术,例如:
- Executors.newScheduledThreadPool(200)来创建定时执行的线程池;
- new ThreadPoolExecutor()来创建ThreadPoolExecutord对象,再创建线程池;
那我们该如何正确创建线程池呢?
正确创建线程池
在阿里巴巴Java开发者手册中有明确规定:禁止使用Executors来创建线程池。
之所以禁止使用Executors创建线程池主要有以下几点原因:
- 第一、Executors创建线程池的时候省去了很多参数,大多都是默认的参数, 导致开发者不能很好理解线程池的运行策略。
- 第二、使用Executors来创建FixedThreadPool和SingleThreadPool的时候,默认的队列长度是Integer.MAX_VALUE,即2147483647,这会堆积大量的请求,如果系统处理不过来,就会导致OOM。
- 第三、使用Executors来创建CachedThreadPool的时候,默认的线程数量是Integer.MAX_VALUE。如果是高并发请求,会导致大量的线程被创建,最终耗尽系统内存,发生内存溢出。
所以,在创建线程池的时候,我们需要正确而严谨的使用合理的方式创建,如果使用不当,就会导致系统发生故障。
最后
线程池的正确使用是一个程序员从初级到中高级的标志,中高级的程序员会接触到更多需要线程池技术来解决的业务场景。所以,精通线程池技术策略以及正确使用线程池尤为重要,希望大家在项目开发中可以合理使用线程池技术,提高系统性能。
閱讀更多 阿邁達聊技術 的文章