库调多了,都忘了最基础的概念-《线程池篇》

简介: 库调多了,都忘了最基础的概念-《线程池篇》

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家

📌 擅长领域:全栈工程师、爬虫、ACM算法

💒 公众号:知识浅谈

🔥 联系方式vx:zsqtcc

XXXX总结

🤞这次都给他拿下🤞

正菜来了⛳⛳⛳

🎈为什么需要线程池?什么是池化技术?

线程池用于管理线程的创建与销毁。

  1. 相比于单线程的频繁创建与销毁消耗的资源,由线程池来管理创建与销毁节省了频繁创建与销毁的时间。
  2. 其次便于对所有的线程进行管理。
  3. 线程的重复使用,提高了利用率
  4. 节省了创建线程的时间,需要线程的时候可以快速使用。
    池化技术:就是提前准备好一些资源,在需要的时候就可以直接使用这些资源,并且能重复使用。如数据库连接池,线程池这些。

🎈线程池有几种创建方式?推荐使用哪种?

自动创建提供的有四种:

  • newFixedThreadPool:创建固定数量的线程池。核心线程数=最大线程数=固定的
  • newCachedThreadPool:能持续创建线程,因为最大的线程数量设置的为Integer.MAX_VALUE
  • newSingleThreadExecutor:只能创建单个线程的线程池,核心线程数=最大线程数=1
  • newScheduledThreadPool:创建一个可以执行延迟任务的线程池。

手动创建ThreadPoolExecutor 手动设置参数,一般都推荐根据业务自己设置不同的参数。

🎈说一下线程池7个参数的含义?

kernel-size:核心线程数也就是线程池中一直存活的线程数

maximumPoolSize :最大线程数,线程池中最多创建的线程数

keepAliveTime:指的是除了核心线程外的空闲线程存活时间。

TimeUnit:存活时间的时间单位。

BlockingQueue:线程池的任务队列。

ThreadFactory:创建线程的工厂。

RejectedExecutionHandler:拒绝策略。

🎈什么是守护线程?它和用户线程有什么区别?

守护线程是对一个线程进行监视的线程。

守护线程是为用户线程服务的,当被守护线程死亡的时候,守护线程也就死亡了。

需要注意的一点:守护线程的设置 setDaemon(true)也就是设置自己的线程为守护线程之后再启动 start()。

🎈为什么创建线程池一定要用ThreadPoolExecutor?

之所以使用手动指定 ThreadPoolExecutor的参数创建线程池,因为这种方式可以通过参数来控制最大任务数和拒绝策略,不仅能根据业务灵活变化,还能让线程池的执行更加透明和可控,降低资源消耗。

🎈线程池有哪些状态?状态是如何转换的?

  • Running:运行状态:线程池运行的时候
  • shutdown:关闭状态:不再接受其他的任务,把当前正在执行的任务和队列中的任务执行完。
  • stop:停滞状态:不再接受其他的任务,并且抛弃当前正在执行的任务和队列中的任务。
  • tiding:整理状态,所有的任务执行完之后,调用terminated()方法
  • terminated:销毁状态,当执行完线程池的 terminated() 方法之后就会变为此状态。

🎈如何使用线程池执行定时任务?

正如上边说到的使用ScheduledThreadPool 执行定时任务。

具体的方法有如下三种:

  • 只执行一次定时任务,使用 schedule 方法执行定时任务
  • 执行多次定时任务,使用 scheduleAtFixedRate 方法执行定时任务
  • 执行多次定时任务,使用 scheduleWithFixedDelay 方法执行定时任务

🎈如何判断线程池已经执行完所有任务了?

  1. 使用 isTerminated 方法判断。
  2. 使用 getCompletedTaskCount 方法判断。
  3. 使用 CountDownLatch 判断。这个在开始设置个数,每个线程执行完,调用countDown()
  4. 使用 CyclicBarrier 判断。

🍚总结

以上就是关于线程池使用的总结,希望有所帮助。

相关文章
|
3月前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
2月前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
57 0
|
3月前
|
安全 Java
Java模拟生产者-消费者问题。生产者不断的往仓库中存放产品,消费者从仓库中消费产品。其中生产者和消费者都可以有若干个。在这里,生产者是一个线程,消费者是一个线程。仓库容量有限,只有库满时生产者不能存
该博客文章通过Java代码示例演示了生产者-消费者问题,其中生产者在仓库未满时生产产品,消费者在仓库有产品时消费产品,通过同步机制确保多线程环境下的线程安全和有效通信。
|
3月前
|
缓存 前端开发 JavaScript
一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
【8月更文挑战第11天】一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
36 0
一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
|
4月前
|
Java 程序员 调度
Java中的多线程编程:概念、实现及性能优化
【5月更文挑战第85天】本文主要探讨了Java中的多线程编程,包括其基本概念、实现方式以及如何进行性能优化。首先,我们将介绍多线程的基本概念,然后详细讨论如何在Java中实现多线程,包括继承Thread类和实现Runnable接口两种方式。最后,我们将探讨一些提高多线程程序性能的策略,如使用线程池和减少同步开销等。
|
3月前
|
数据采集 存储 监控
如何使用pholcus库进行多线程网页标题抓取以提高效率?
如何使用pholcus库进行多线程网页标题抓取以提高效率?
|
4月前
|
监控 Java 调度
Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点
Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点
73 1
|
4月前
|
网络协议 安全 Python
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
|
4月前
|
缓存 Linux 编译器
【Linux】多线程——线程概念|进程VS线程|线程控制(下)
【Linux】多线程——线程概念|进程VS线程|线程控制(下)
66 0
|
4月前
|
存储 Linux 调度
【Linux】多线程——线程概念|进程VS线程|线程控制(上)
【Linux】多线程——线程概念|进程VS线程|线程控制(上)
69 0