12.28 60%的Java程序员在错误的使用线程池,如何正确创建线程池

前言

阿里的Java开发者手册中对于线程池的创建有很多强制性的限制,其中最重要的一条就是:

线程池不允许使用Executors去创建,那我们改如何正确的使用Java线程池技术呢?

Java线程池使用场景

Java线程池技术是我们经常会用到的一项技术,例如定时任务、异步数据处理、队列等我们都会用到线程池技术。Java的JUC包有很多API可以让我们创建一个线程池,那这些API我们改如何正确使用呢?为什么在阿里的Java开发者手册中对于线程池的创建有很多强制性的限制?例如,不能使用Excuro来创建线程池。这篇文章将详细为大家介绍Java线程池的几种类型以及如何正确创建线程池。

60%的Java程序员在错误的使用线程池,如何正确创建线程池


四种内置线程池


60%的Java程序员在错误的使用线程池,如何正确创建线程池


Java JUC包中有四种内置的线程池技术,包括单线程的线程池、固定大小的线程池、可缓存的线程池、定时执行的线程池。

  • 1、单线程的线程池(newSingleThreadExecutor)

单线程的线程池中只有一个线程,也就是所有任务都是通过这一个线程来串行执行,保证了执行任务按照提交顺序来执行。如果业务只是涉及到异步执行,可选择该线程池技术。

  • 2、固定大小的线程池(newFixedThreadPool)

固定大小的线程池创建的时候限制了线程池中线程的数量。当有新的任务创建的时候,就创建一个新的线程来执行任务。

当线程池中的线程数量达到设定的值的时候,任务开始等待执行,直到有可用的线程。

  • 3、可缓存的线程池(newCachedThreadPool)

可缓存的线程池不限定线程数量,当有新的任务加入,如果没有可用的线程,那就创建新的线程。线程最大数量取决于操作系统所能创建的最大线程数量。此线程池技术也是项目开发中不被推荐的一种方法,因为如何控制不好任务数量,将会导致大量的线程被创建,影响系统的性能

  • 4、定时执行的线程池(newScheduledThreadPool)

定时执行的线程池支持创建无线数量的线程池,并且线程按照设定的时间周期执行。

60%的Java程序员在错误的使用线程池,如何正确创建线程池


四种线程池适用不同的业务场景,我们可以根据业务类型来选择使用。JUC中提供了很多API可以让我们方便的创建以上四种线程池技术,例如:

  • Executors.newScheduledThreadPool(200)来创建定时执行的线程池;
  • new ThreadPoolExecutor()来创建ThreadPoolExecutord对象,再创建线程池;

那我们该如何正确创建线程池呢?

正确创建线程池


在阿里巴巴Java开发者手册中有明确规定:禁止使用Executors来创建线程池。

60%的Java程序员在错误的使用线程池,如何正确创建线程池


之所以禁止使用Executors创建线程池主要有以下几点原因:

  • 第一、Executors创建线程池的时候省去了很多参数,大多都是默认的参数,
    导致开发者不能很好理解线程池的运行策略。
  • 第二、使用Executors来创建FixedThreadPool和SingleThreadPool的时候,默认的队列长度是Integer.MAX_VALUE,即2147483647,这会堆积大量的请求,如果系统处理不过来,就会导致OOM。
  • 第三、使用Executors来创建CachedThreadPool的时候,默认的线程数量是Integer.MAX_VALUE。如果是高并发请求,会导致大量的线程被创建,最终耗尽系统内存,发生内存溢出。

所以,在创建线程池的时候,我们需要正确而严谨的使用合理的方式创建,如果使用不当,就会导致系统发生故障。

60%的Java程序员在错误的使用线程池,如何正确创建线程池


最后

线程池的正确使用是一个程序员从初级到中高级的标志,中高级的程序员会接触到更多需要线程池技术来解决的业务场景所以,精通线程池技术策略以及正确使用线程池尤为重要,希望大家在项目开发中可以合理使用线程池技术,提高系统性能


分享到:


相關文章: