多线程 线程池相关

线程池也是一种池化思想的实现,常见的有 线程池、字符串常量池、数据库连接池 等。
线程复用,降低线程创建和销毁的造成的消耗

4.源码

在这里插入图片描述
corePoolSize–
the number of threads to keep in the pool, even if they are idle, unless allowCoreThreadTimeOut is set

池中要保留的线程数,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOut( private volatile boolean allowCoreThreadTimeOut;

maximumPoolSize –
the maximum number of threads to allow in the pool

池中允许的最大线程数

keepAliveTime –
when the number of threads is greater than the core,
this is the maximum time that excess idle threads will wait for new tasks before terminating.

当线程数大于核心数时,这是多余空闲线程在终止前等待新任务的最长时间。

unit –
the time unit for the keepAliveTime argument

keepAliveTime参数的时间单位

workQueue –
the queue to use for holding tasks before they are executed.
This queue will hold only the Runnable tasks submitted by the execute method.

用于在任务执行前保存任务的队列。此队列将仅包含execute方法提交的可运行任务。

threadFactory –
the factory to use when the executor creates a new thread

执行器 创建新线程时要使用的工厂

handler –
the handler to use when execution is blocked because the thread bounds and queue capacities are reached

由于达到线程边界和队列容量而阻止执行时要使用的处理程序

线程池合适的线程数量是多少,以及 CPU 核心数和线程数的关系。

1.CPU密集型

第一种是 CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。

最佳线程数 = CPU 核心数的 1~2 倍

如果设置过多的线程,实际上并不会起到很好的效果。此时假设我们设置的线程数是 CPU 核心数的 2 倍以上,因为计算机的任务很重,会占用大量的 CPU 资源,所以这是 CPU 每个核心都是满负荷工作,而设置过多的线程数,每个线程都去抢占 CPU 资源,就会产生不必要的上下文切换,反而会造成整体性能的下降。

2.IO密集型

第二种任务是耗时 IO 型,比如数据库、文件的读写,网络通信等任务,这种任务的特点是并不会特别消耗 CPU 资源,但是 IO 操作很耗时,总体会占用比较多的时间。

对于这种情况任务最大线程数一般会大于 CPU 核心数很多倍,因为 IO 读写速度相比于 CPU 的速度而言是比较慢的,如果我们设置过少的线程数,可能导致 CPU 资源的浪费。而如果我们设置更多的线程数,那么当一部分线程正在等待 IO 的时候,它们此时并不需要 CPU 来计算,那么另外的线程便可以利用 CPU 去执行其他的任务,互不影响,这样的话在任务队列中等待的任务就会减少,可以更好地利用资源。

3.通用公式

线程数 = CPU核数 * (1+ IO 耗时/CPU 耗时)

通过这个公式,我们可以计算出一个合理的线程数量,如果任务的 IO 耗时时间长,线程数就随之增加,而如果CPU 耗时长,也就是对于我们上面的 CPU 密集型任务,线程数就随之减少。

太少的线程数会使得程序整体性能降低,而过多的线程也会消耗内存等其他资源,所以如果想要更准确的话,可以进行压测,监控 JVM 的线程情况以及 CPU 的负载情况,根据实际情况衡量应该创建的线程数,合理并充分利用资源。

4. 小结

线程CPU 耗时长,需要越少的线程,线程IO 耗时长,需要越多的线程
针对不同的程序,进行对应的实际测试就可以得到最合适的选择,线程数 >= CPU 核心数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值