线程池相关

1. 线程池的作用

线程池是一种线程管理技术,它可以在系统初始化时创建一定数量的线程,并将它们放入一个池中等待调用。当有任务需要执行时,线程池中的一个线程会被分配来执行任务,当任务执行完成后该线程会被返回到线程池中,以便下一次使用。

线程池的作用是优化线程的创建和销毁过程,通过重复使用已创建的线程来减少不必要的开销,提高系统性能及效率。它还可以帮助控制线程的数量和资源占用,有效避免由于线程过多而导致系统崩溃的情况的发生

2. 使用线程池的意义

  1. 可以节省时间(架构)
  2. 通过线程池,可以规定线程的名字,我可以知道我这个线程池当中有哪些线程执行了哪些任务,通过日志可以快速定位问题。(管理)

3. 线程池的几个重要参数 

  1. 最小线程数:项目启动的时候,初始化的线程数;
  2. 核心线程数:当线程池的线程都忙碌时,再进来新任务时,由最小线程数扩容到核心线程数;
  3. 最大线程数:当核心线程数满了,当队列也满了,再来新任务,就会创建新线程来执行这个新任务,直到线程数达到最大线程数;
  4. 队列大小:当线程数达到核心线程数,再进来的任务就会进入到队列;
  5. 存活时间:当线程超过多长时间不执行任务,处于空闲状态,线程池会将它回收,直到数量达到核心线程数。

在创建线程池的时候,要结合具体的业务,来规划这些参数。

核心线程数:一般设置为cpu和核数;

最大线程数:一般设置为cpu的核数。

cpu的核数代表着同一时刻,多少个线程可以一起运行。  

4. 线程池拒绝策略

如果说线程数达到最大线程数,并且队列也满了,就要执行拒绝策略。

  1. 报错,告诉开发这个任务线程池执行不了,由开发来决定是否丢弃
  2. 丢弃当前任务
  3. 丢弃队列当中头结点的任务,最先进入队列的任务
  4. 由主线程去执行这个任务

一般情况下,前三种都会有丢弃任务的风险,但是性能都比较好,第4种最稳妥。

Q:最先派给线程池的任务肯定最先执行?

不一定,根据拒绝策略可知,最先派给线程池的任务有可能被丢弃,所以说线程池不能保证顺序。

5. 线程池队列分类

  • 有界队列:有限制,这个队列最多可能容纳多少个,在创建队列的时候就规定好了;
  • 无界队列:没有限制,来多少收多少。

6. 阿里代码规范中强调,只要是使用多线程,就必须要用线程池去管理。  

你可能感兴趣的:(java,jvm,开发语言)