线程池详解

线程池

  • 什么是线程池
  • 线程池的作用
    • 为什么需要线程池
    • 使用线程池的意义
    • 线程池的几个重要参数
    • 注意事项

什么是线程池

线程池的作用

线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。

为什么需要线程池

线程池的创建是需要时间的,如果每次使用新县城的时候,都去创建线程是比较费时的。但是如果将线程先创建好放到池子里面,用的时候直接从池子中去取,就省略了创建线程的时间。

使用线程池的意义

1、可以节省时间。
2、通过线程池,可以规定线程的名字,通过线程池可以了解到哪个线程池执行了哪些任务,通过日志可以快速定位问题。

线程池的几个重要参数

首先了解一下多线程:当一个项目注册用户后,需要进行发短信,添加数据库,发mq通知其他微服务,将用户信息刷新到缓存里面。如果交给一个线程,需要花费很多时间。我们初始化多个线程的话,以上服务就可以有多个线程同时进行。

重要参数:
1、最小线程数:项目启动的时候初始化的线程数。
2、核心线程数:当线程池的线程都忙碌时,再进来新任务时,由最小线程数扩容到核心线程数。
3、队列大小:当线程数达到核心线程数,再进来的任务就会进入到队列。
4、最大线程数:当核心线程数满了,队列也满了,再进来新任务时,就会创建新线程来执行这个任务,知道线程数达到最大线程数。
5、拒绝策略:当线程达到最大线程数,并且队列也满了,则执行拒绝策略。
(1)报错:告诉开发者这个任务线程池无法执行,有开发者决定是否丢弃。
(2)丢弃当前任务
(3)丢弃队列中头结点的任务即最先进入队列的任务
(4)由主线程去执行这个任务
一般情况下,前三种都有丢弃任务的风险,但是性能比较好。第四种最为稳妥。

注意事项

1、当线程超过规定时间不执行任务时,处于空闲状态,线程池会将它收回,直到达到核心线程数。在创建线程池的时候,要结合具体的业务来规划这些参数。
2、线程池不能保证任务的执行顺序。
3、阿里的规范中,只要是多线程,就要使用线程池去管理。
4、核心线程数一般设置为cpu的核数,最大线程数一般设置为cpu的核数*2。cpu的核数代表同一时刻可以一起运行的线程数。

你可能感兴趣的:(java)