当前位置: 首页 > news >正文

线程池若干问题

  1. 线程池中线程异常后,销毁还是复用?

  2. 线程池在提交任务前,可以提前创建线程吗?

线程池中线程异常后,销毁还是复用?

直接说结论,需要分两种情况:

  • 使用execute()提交任务:当任务通过execute()提交到线程池并在执行过程中抛出异常时,如果这个异常没有在任务内被捕获,那么该异常会导致当前线程终止,并且异常会被打印到控制台或日志文件中。线程池会检测到这种线程终止,并创建一个新线程来替换它,从而保持配置的线程数不变。

  • 使用submit()提交任务:对于通过submit()提交的任务,如果在任务执行中发生异常,这个异常不会直接打印出来。相反,异常会被封装在由submit()返回的Future对象中。当调用Future.get()方法时,可以捕获到一个ExecutionException。在这种情况下,线程不会因为异常而终止,它会继续存在于线程池中,准备执行后续的任务。

简单来说:使用execute()时,未捕获异常导致线程终止,线程池创建新线程替代;使用submit()时,异常被封装在Future中,线程继续复用。

这种设计允许submit()提供更灵活的错误处理机制,因为它允许调用者决定如何处理异常,而execute()则适用于那些不需要关注执行结果的场景。

具体的源码分析可以参考这篇:线程池中线程异常后:销毁还是复用?- 京东技术。

线程池在提交任务前,可以提前创建线程吗?

答案是可以的!ThreadPoolExecutor 提供了两个方法帮助我们在提交任务之前,完成核心线程的创建,从而实现线程池预热的效果:

  • prestartCoreThread():启动一个线程,等待任务,如果已达到核心线程数,这个方法返回 false,否则返回 true;

  • prestartAllCoreThreads():启动所有的核心线程,并返回启动成功的核心线程数。

http://www.lryc.cn/news/374642.html

相关文章:

  • k8s+RabbitMQ单机部署
  • github.com/therecipe/qt windows中安装
  • LogicFlow 学习笔记——11. 对齐线 和 键盘快捷键
  • FastWeb - Lua开源跨平台网站开发服务
  • 原子阿波罗STM32F767程序的控制器改为STM32F407驱动LCD屏
  • 04-jQuery工具函数及 jQuery 插件
  • 基于Python的花卉识别分类系统【W9】
  • Visual Studio Code 配置教程,手把手教你如何配置
  • 教案:Horovod v0.2 介绍与使用
  • 深入探索Spring Boot:原理与实践
  • 基于SSM框架的电影院售票网站
  • oracle发送http请求
  • 软件回归测试:策略及案例分析
  • openstack搭建
  • HIVE及SparkSQL优化经验
  • Django 5 Web应用开发实战
  • 互联网摸鱼日报(2024-06-17)
  • Docker Desktop Installer For Windows 国内下载地址
  • 做好程序前设计
  • SpringCloud:Feign远程调用
  • leetcode-05-[242]有效的字母异位词[349]两个数组的交集[202]快乐数[1]两数之和
  • C语言实现动态栈
  • 进程间的通信
  • hadoop/hive/DBeaver启动流程
  • 1节18650锂电池的容量是多大,电流,电压是多大
  • 基于GA遗传算法的多机无源定位系统GDOP优化matlab仿真
  • Linux C语言:多级指针(void指针和const)
  • MicroPython+ESP32 C3开发上云
  • 动态 SQL
  • 功能强大的多功能文档转换工具Neevia Document Converter Pro 7.5.0.241