当前位置:首页 > 经验 >

线程池的工作原理图解(线程池架构原理图)

来源:原点资讯(www.yd166.com)时间:2022-11-03 05:53:12作者:YD166手机阅读>>

线程池的工作原理图解,线程池架构原理图(1)

为什么需要线程池

我们有两种常见的创建线程的方法,一种是继承Thread类,一种是实现Runnable的接口,Thread类其实也是实现了Runnable接口。但是我们创建这两种线程在运行结束后都会被虚拟机销毁,如果线程数量多的话,频繁的创建和销毁线程会大大浪费时间和效率,更重要的是浪费内存。那么有没有一种方法能让线程运行完后不立即销毁,而是让线程重复使用,继续执行其他的任务哪?

这就是线程池的由来,很好的解决线程的重复利用,避免重复开销。

线程池的优点

1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。

2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。

线程池的风险

虽然线程池是构建多线程应用程序的强大机制,但使用它并不是没有风险的。用线程池构建的应用程序容易遭受任何其它多线程应用程序容易遭受的所有并发风险,诸如同步错误和死锁,它还容易遭受特定于线程池的少数其它风险,诸如与池有关的死锁、资源不足和线程泄漏。

1.死锁

任何多线程应用程序都有死锁风险。当一组进程或线程中的每一个都在等待一个只有该组中另一个进程才能引起的事件时,我们就说这组进程或线程 死锁了。死锁的最简单情形是:线程 A 持有对象 X 的独占锁,并且在等待对象 Y 的锁,而线程 B 持有对象 Y 的独占锁,却在等待对象 X 的锁。除非有某种方法来打破对锁的等待(Java 锁定不支持这种方法),否则死锁的线程将永远等下去。

2.资源不足

线程池的一个优点在于:相对于其它替代调度机制(有些我们已经讨论过)而言,它们通常执行得很好。但只有恰当地调整了线程池大小时才是这样的。

线程消耗包括内存和其它系统资源在内的大量资源。除了
Thread 对象所需的内存之外,每个线程都需要两个可能很大的执行调用堆栈。除此以外,JVM 可能会为每个 Java
线程创建一个本机线程,这些本机线程将消耗额外的系统资源。最后,虽然线程之间切换的调度开销很小,但如果有很多线程,环境切换也可能严重地影响程序的性能。

如果线程池太大,那么被那些线程消耗的资源可能严重地影响系统性能。在线程之间进行切换将会浪费时间,而且使用超出比您实际需要的线程可能会引起资源匮乏问题,因为池线程正在消耗一些资源,而这些资源可能会被其它任务更有效地利用。

除了线程自身所使用的资源以外,服务请求时所做的工作可能需要其它资源,例如 JDBC 连接、套接字或文件,这些也都是有限资源,有太多的并发请求也可能引起失效,例如不能分配 JDBC 连接。

3.并发错误

线程池和其它排队机制依靠使用
wait() 和 notify()
方法,这两个方法都难于使用。如果编码不正确,那么可能丢失通知,导致线程保持空闲状态,尽管队列中有工作要处理。使用这些方法时,必须格外小心;即便是专家也可能在它们上面出错。而最好使用现有的、已经知道能工作的实现,例如在
util.concurrent 包。

4.线程泄漏

各种类型的线程池中一个严重的风险是线程泄漏,当从池中除去一个线程以执行一项任务,而在任务完成后该线程却没有返回池时,会发生这种情况。发生线程泄漏的一种情形出现在任务抛出一个 RuntimeException 或一个 Error 时。

如果池类没有捕捉到它们,那么线程只会退出而线程池的大小将会永久减少一个。当这种情况发生的次数足够多时,线程池最终就为空,而且系统将停止,因为没有可用的线程来处理任务。

5.请求过载

仅仅是请求就压垮了服务器,这种情况是可能的。在这种情形下,我们可能不想将每个到来的请求都排队到我们的工作队列,因为排在队列中等待执行的任务可能会消耗太多的系统资源并引起资源缺乏。在这种情形下决定如何做取决于您自己;在某些情况下,您可以简单地抛弃请求,依靠更高级别的协议稍后重试请求,您也可以用一个指出服务器暂时很忙的响应来拒绝请求。

线程池的实现原理

线程池

线程池的工作原理图解,线程池架构原理图(2)

1.线程池状态

线程池和线程一样拥有自己的状态,在ThreadPoolExecutor类中定义了一个volatile变量runState来表示线程池的状态,线程池有四种状态,分别为RUNNING、SHURDOWN、STOP、TERMINATED。

  • 线程池创建后处于RUNNING状态。
  • 调用shutdown后处于SHUTDOWN状态,线程池不能接受新的任务,会等待缓冲队列的任务完成。
  • 调用shutdownNow后处于STOP状态,线程池不能接受新的任务,并尝试终止正在执行的任务。
  • 当线程池处于SHUTDOWN或STOP状态,并且所有工作线程已经销毁,任务缓存队列已经清空或执行结束后,线程池被设置为TERMINATED状态。

线程池原理:预先启动一些线程,线程无限循环从任务队列中获取一个任务进行执行,直到线程池被关闭。如果某个线程因为执行某个任务发生异常而终止,那么重新创建一个新的线程而已,如此反复。

2.线程池的处理流程

1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。

2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。

3、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。

线程池的工作原理图解,线程池架构原理图(3)

配置线程池大小配置

一般需要根据任务的类型来配置线程池大小:

如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 NCPU 1

如果是IO密集型任务,参考值可以设置为2*NCPU

当然,这只是一个参考值,具体的设置还需要根据实际情况进行调整,比如可以先将线程池大小设置为参考值,再观察任务运行情况和系统负载、资源利用率来进行适当调整。

Java提供的四种线程池实现

(1)newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

(2)newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

(3)newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

(4)newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

以上就是线程池的介绍!

栏目热文

中尉转业能安排什么职位(2022军官转业费一览表)

中尉转业能安排什么职位(2022军官转业费一览表)

经历了2021跟2022两次退役之后,很多人清醒地认识到,想要趁着年轻走,难了。想要在30岁之前就转业回家,基本不可能了...

2022-11-03 05:29:05查看全文 >>

上士相当什么级别(上士退伍安排工作吗)

上士相当什么级别(上士退伍安排工作吗)

2月28日关于现役士兵衔级制度的决定通过了新的士兵军衔制度2022年3月31日施行后将会给部队,特别是士兵群体带来怎样的...

2022-11-03 05:20:02查看全文 >>

副连职中尉相当于什么(副连职对应中尉还是少尉)

副连职中尉相当于什么(副连职对应中尉还是少尉)

“连”是属于军队的基层组织,在部队中有着极其重要的位置。新兵下连队,也就是说把新兵分配各个基层部队,而军官下基层挂职也就...

2022-11-03 05:18:55查看全文 >>

中尉可以管多少个人(中尉一般干啥)

中尉可以管多少个人(中尉一般干啥)

<span class="bjh-h3">我国历史中陆军排长到军长分别是什么军衔,管多少人?权利有多大一般玩...

2022-11-03 06:03:54查看全文 >>

上尉转业是什么级别(上尉军官转业一般到什么单位)

上尉转业是什么级别(上尉军官转业一般到什么单位)

文 | 丁勇 整理前线哥说军改稳步推进,今年的干部转业复员工作已经展开。离开部队后,能不能在地方找到好的单位、好的岗位,...

2022-11-03 05:34:24查看全文 >>

自己动手实现线程池(如何实现一个完整的线程池)

自己动手实现线程池(如何实现一个完整的线程池)

前言线程池大家在开发中应该有都有用过,其实线程池就是把一堆线程创建好了放在一个容器中,需要用的时候就直接拿出来用,用完之...

2022-11-03 05:50:25查看全文 >>

2种线程池底层实现原理(线程池底层结构图解)

2种线程池底层实现原理(线程池底层结构图解)

点击上方关注,每天学习一个Java知识点原创: 林湾村龙猫程序的运行,其本质上,是对系统资源(CPU、内存、磁盘、网络等...

2022-11-03 05:40:00查看全文 >>

线程池的基本原理看完就懂了(线程池原理非常详细)

线程池的基本原理看完就懂了(线程池原理非常详细)

随着cpu核数越来越多,不可避免的利用多线程技术以充分利用其计算能力。所以,多线程技术是服务端开发人员必须掌握的技术。线...

2022-11-03 05:58:05查看全文 >>

线程池的工作原理及图解(线程池源码深度解析)

线程池的工作原理及图解(线程池源码深度解析)

前言本文以程序员做需求的例子,比喻线程池的工作过程。以故事白话的方式展开,跟大家阐述线程池工作原理,以方便大家更好理解线...

2022-11-03 05:41:56查看全文 >>

高并发三种解决方法(大数据高并发解决方案)

高并发三种解决方法(大数据高并发解决方案)

一、什么是高并发高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通...

2022-11-03 06:02:03查看全文 >>

文档排行