线程池

参考链接

4种常用线程池介绍

对线程池的了解

线程池在系统启动时即在内存中 创建大量空闲的线程

  • 程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务
  • 执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务

原因(优势)

多线程运行时间:

  • 系统不断的启动和关闭新线程,成本非常高,会过渡消耗系统资源
  • 以及过渡切换线程的危险,从而可能导致系统资源的崩溃

使用线程池可以 充分利用系统资源,很好地 提高性能

工作机制

在线程池的编程模式下,任务是提交给 整个线程池,而不是直接提交给某个线程

线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的线程

一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务

四种常见的线程池

Java通过 Executors 是静态工厂的功能,生产各种类型线程池,提供了四种线程池

Executor是线程池的顶级接口,只是一个执行线程的工具,只提供一个execute(Runnable command)的方法

线程池的 返回值 ExecutorService,是真正的线程池接口

  • Java提供的用于管理线程池的类
  • 该类的两个作用:控制线程数量和重用线程

Executors.newCacheThreadPool()

可缓存线程池

  • 先查看池中有没有以前建立的线程
  • 如果有,就直接使用。如果没有,就建一个新的线程加入池中
  • 调用 execute() 时可以重用缓存中的线程
  • 缓存型池子通常用于执行一些 生存期很短的异步型任务
    在这里插入图片描述

Executors.newFixedThreadPool(int n)

创建一个 可重用固定个数 的线程池,以共享的无界队列方式来运行这些线程

控制线程最大并发数,超出的线程会在队列中等待
在这里插入图片描述

Executors.newScheduledThreadPool(int n)

创建一个 定长线程池,支持定时及周期性任务执行

在这里插入图片描述

Executors.newSingleThreadExecutor()

创建一个单线程化的线程池

它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

在这里插入图片描述

线程池是越大越好吗

参考链接

Java项目中,线程池中线程数量太大会有什么影响?

当线程数量配置的过大,线程与线程之间会 争取 CPU 资源,这就会导致 上下文切换

线程栈是需要分配内存空间的,所以 分配内存空间有数量上限

影响线程池设置大小的因素

参考链接

线程池合适的线程数量是多少?

线程的 CPU 耗时所占比例越高,就需要 越少的线程

线程的 IO 耗时所占比例越高,就需要 越多的线程

线程数 >= CPU 核心数

CPU密集型任务

线程中基本不会有阻塞导致让出CPU,只有在时间片用完以后,才可能让出CPU

这种情况发生线程切换的次数要少很多,不建议设置太大

  • 需要在更多的争抢机会和更少的上下文切换之间取得平衡

IO密集型任务(堵塞IO)

处理的是会对线程产生阻塞的IO密集型任务,那要提高吞吐量:

基于IO多路复用+NIO/AIO

中转站:

网络 I/O模型

  • 想办法去掉不必要的阻塞,尽量把阻塞型的IO密集任务,转成CPU密集任务
  • 这样只需要少量线程也可以获得很高的吞吐量(select、poll 、epoll、nginx)

扩大线程数

理论上来说,只要线程数不会导致明显的上下文切换损耗,而且不会造成内存溢出,线程池就可以设置的足够大

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值