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

一文详解线程池

什么是线程池?

线程池:就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。

为什么用线程池?

线程池的优势:线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。

线程池的主要特点为:线程复用;控制最大并发数;管理线程。

  1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  2. 提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。
  3. 提高线程的可观理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

线程池的使用

Java里面线程池的顶级接口是java.util.concurrent.Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是java.util.concurrent.ExecutorService。要配置一个线程池是比较复杂的,尤其是对于池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在java.util.concurrent.Executors线程工厂类里面提供了一些静态工厂,生成一些常用的线程池。官方建议使用Executors工程类来创建线程池对象。

Executors类中创建线程池的方法如下:

  • newFixedThreadPool创建一个固定长度的线程池,当到达线程最大数量时,线程池的规模将不再变化。一池有N个固定的线程
  • newSingleThreadPoolExecutor创建一个单线程的Executor,确保任务对了,串行执行。一池一线程
  • newCachedThreadPool创建一个可缓存的线程池,如果当前线程池的规模超出了处理需求,将回收空的线程;当需求增加时,会增加线程数量;线程池规模无限制。动态的创建线程,来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。
  • newScheduledThreadPool创建一个固定长度的线程池,而且以延迟或者定时的方式来执行,类似Timer。

线程池的execute方法和submit有什么区别

1、参数

  • execute   Runnable
  • submit     Callable

2、返回值

  • execute   void
  • submit     Future

3、异常

  • execute   会在子线程中抛出异常,在主线程中铺捉不到
  • submit     不会立马抛出异常,而是会将异常暂时存起来,等Future.get()方法的时候才会抛出,可以在主线程捕捉,处理异常更方便

超级大坑   在工作中单一的/固定数的/可变的三种创建线程池的方法哪个用的多?

  • 一个都不用,工作中只能使用自定义的。

线程池中的2个关闭方法

shutdown:线程池不再接口新任务,内部会将所有已提交的任务处理完毕,处理完毕之后,工作线程自动退出。

shutdownNow:线程池会将还未处理的(在队里等待处理的任务)任务移除,将正在处理中的处理完毕之后,工作线程自动退出。

至于调用哪个方法来关闭线程,应该由提交到线程池的任务特性决定,多数情况下调用shutdown方法来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow方法。


http://www.kler.cn/news/350674.html

相关文章:

  • uniapp一键打包
  • Android Audio基础——音频混音线程介绍(十)
  • 鸿蒙next之导航组件跳转携带参数
  • 最新版本jdbcutils集成log4j做详细sql日志、自动释放连接...等
  • 【工具】新手礼包之git相关环境包括中文的一套流程{收集和整理},gitlab的使用
  • Vivado自定义IP修改顶层后Port and Interface不更新解决方案
  • R语言统计分析——折线图
  • 【uniapp】实现触底加载数据
  • Linux实验三
  • MySQL 数据库--查询
  • 《数据之海》
  • LeetCode 第419场周赛个人题解
  • Spring Boot在医疗病历B2B交互中的技术突破
  • 设计模式和软件框架的关系
  • 【优先算法】--双指针1
  • 【二刷hot-100】day1
  • 家政行业小程序需要哪些功能?
  • STM32—旋转编码器控制直流电机(标准库)
  • Luminar Neo v1.21.0.13934 图像编辑软件绿色便携版
  • Angular 19 的改进功能
  • torch.fft 出现 ComplexHalf 或 Half 不支持
  • java互联网医院智能导诊系统源码,Uniapp前端开发框架,支持一次编写,多端运行
  • 分享一个图片RGB以及16进制颜色提取的在线网站
  • Lobby——网络游戏大厅设计与参考建议!!!
  • FreeRTOS:事件标志组
  • SpringMVC源码-接口请求执行流程,包含九大内置组件的实例化初始化,拦截器调用,页面渲染等源码讲解