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

一文详解线程池

什么是线程池?

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

为什么用线程池?

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

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

  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.lryc.cn/news/461532.html

相关文章:

  • 网际报文协议ICMP及ICMP重定向实例详解2
  • CSS 总结
  • C语言_指针_进阶
  • chat_gpt回答:python使用writearray写tiff速度太慢,有什么快速的方法吗
  • 【时时三省】(C语言基础)函数介绍strcat
  • ESP32C3 开发板在Linux环境下,进行JTAG 调试演示-启明云端乐鑫代理商
  • 《计算机视觉》—— 基于PyCharm中的dlib库实现人脸关键点定位
  • c++习题34-说谎
  • 如何使用Android Profiler进行性能分析?
  • 整理—MySQL
  • 临时配置linux Bridge网桥
  • 【Canvas与化学】铁元素图标
  • list转map常用方法
  • C++容器适配器的模拟实现-stack、queue、priority_queue
  • fastapi的docs页面是空白解决
  • 浙大数据结构:11-散列4 Hashing - Hard Version
  • pm2 守护http-server
  • 国外电商系统开发-运维系统应用管理
  • 剖析线程池实现原理
  • 【中危】Oracle TNS Listener SID 可以被猜测
  • 三维测量与建模笔记 - 简介
  • Glide 简易教程
  • flutter 使用三方/自家字体
  • 2024台州赛CTFwp
  • 词根plac-和place、please
  • ubuntu下route命令详解
  • 13.java面向对象:面向对象的三大特征
  • 【VUE】Vue中的内置组件
  • 若依框架篇-若依框架搭建具体过程、后端源代码分析、功能详解(权限控制、数据字典、定时任务、代码生成、表单构建、接口测试)
  • 恢复已删除文件的 10 种安卓数据恢复工具