线程池最大线程数量怎么确定_线程池最佳线程数量到底要如何配置?

本文介绍了线程池的作用和避免频繁创建销毁线程的重要性。通过分析`Executors`类提供的线程池创建方法,如`newFixedThreadPool`、`newCachedThreadPool`等,讨论了不同线程池的特性和适用场景。同时,文章指出阿里巴巴开发规范建议避免直接使用`Executors`创建线程池,并推荐使用`ThreadPoolExecutor`来自定义线程池。最后,讨论了如何确定线程池的最佳线程数量,包括经验值和计算公式,为实际开发提供参考。
摘要由CSDN通过智能技术生成

前言

对应从事后端开发的同学来说,线程是必须要使用了,因为使用它可以提升系统的性能。但是,创建线程和销毁线程都是比较耗时的操作,频繁的创建和销毁线程会浪费很多CPU的资源。此外,如果每个任务都创建一个线程去处理,这样线程会越来越多。我们知道每个线程默认情况下占1M的内存空间,如果线程非常多,内存资源将会被耗尽。这时,我们需要线程池去管理线程,不会出现内存资源被耗尽的情况,也不会出现频繁创建和销毁线程的情况,因为它内部是可以复用线程的。

从实战开始

在介绍线程池之前,让我们先看个例子。

public class MyCallable implements Callable {    @Override    public String call() throws Exception {          System.out.println("MyCallable call");          return "success";    }    public static void main(String[] args) {        ExecutorService threadPool = Executors.newSingleThreadExecutor();        try {            Future future = threadPool.submit(new MyCallable());            System.out.println(future.get());        } catch (Exception e) {           System.out.println(e);        } finally {            threadPool.shutdown();        }}}

这个类的功能就是使用Executors类的newSingleThreadExecutor方法创建了的一个单线程池,他里面会执行Callable线程任务。

创建线程池的方法

我们仔细看看Executors类,会发现它里面给我们封装了不少创建线程池的静态方法,如下图所示:

eb0a78e570b18532831bee1e45bfd6ea.png

其实,我们总结一下其实只有6种:

1.newCachedThreadPool可缓冲线程池

9e4a68f3a731be4eb8611b41be008f82.png

它的核心线程数是0,最大线程数是integer的最大值,每隔60秒回收一次空闲线程,使用SynchronousQueue队列。SynchronousQueue队列比较特殊,内部只包含一个元素,插入元素到队列的线程被阻塞,直到另一个线程从队列中获取了队列

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程池是一种多线程处理技术,它可以有效地减少线程的创建和销毁的开销,提高系统的性能和稳定性。 线程池的优点有: 1. 降低系统资源消耗:线程池可以避免频繁创建和销毁线程的开销,节省系统资源。 2. 提高系统响应速度:线程池可以复用已经创建的线程,降低线程创建的时间和线程上下文切换的开销,提高系统的响应速度。 3. 提高系统稳定性:线程池可以对线程进行统一的管理和调度,避免线程的死锁、饥饿等问题,提高系统的稳定性。 线程池的实现原理是:线程池线程池管理器、工作线程和任务队列三部分组成。线程池管理器负责创建、销毁和管理工作线程,任务队列用于存储等待执行的任务,工作线程则负责执行队列中的任务。 线程池中的任务队列通常使用链表或者数组实现,线数量的决定需要考虑系统的实际情况,包括 CPU 核心数、内存大小、磁盘 I/O 等因素。通常可以通过测试来确定最优的线数量线程池中的任务队列有三种类型: 1. 直接提交:将任务直接提交给工作线程执行。 2. 有界队列:使用有限的队列来存储等待执行的任务,超出队列容量的任务会被拒绝。 3. 无界队列:使用无限的队列来存储等待执行的任务,任务队列不会拒绝任何任务,但是会占用大量的内存资源。 线程在处理任务过程中,可能会出现异常,为了避免线程的死亡导致整个系统崩溃,可以使用 try-catch 块来捕获异常,并且可以将异常信息记录到日志中,方便后续的排查和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值