二期0005线程池原理剖析&锁的深度化

baronboy baronboy     2023-04-12     554

关键词:

0005 线程池原理剖析&锁的深度化

线程池原理剖析

提交一个任务到线程池中,线程池的处理流程如下:

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

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

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

合理配置线程池

要想合理的配置线程池,就必须首先分析任务特性,可以从以下几个角度来进行分析:

任务的性质:CPU密集型任务,IO密集型任务和混合型任务。

任务的优先级:高,中和低。

任务的执行时间:长,中和短。

任务的依赖性:是否依赖其他系统资源,如数据库连接。

任务性质不同的任务可以用不同规模的线程池分开处理。CPU密集型任务配置尽可能少的线程数量,如配置Ncpu+1个线程的线程池。IO密集型任务则由于需要等待IO操作,线程并不是一直在执行任务,则配置尽可能多的线程,如2*Ncpu。混合型的任务,如果可以拆分,则将其拆分成一个CPU密集型任务和一个IO密集型任务,只要这两个任务执行的时间相差不是太大,那么分解后执行的吞吐率要高于串行执行的吞吐率,如果这两个任务执行时间相差太大,则没必要进行分解。我们可以通过Runtime.getRuntime().availableProcessors()方法获得当前设备的CPU个数。

优先级不同的任务可以使用优先级队列PriorityBlockingQueue来处理。它可以让优先级高的任务先得到执行,需要注意的是如果一直有优先级高的任务提交到队列里,那么优先级低的任务可能永远不能执行。

执行时间不同的任务可以交给不同规模的线程池来处理,或者也可以使用优先级队列,让执行时间短的任务先执行。

依赖数据库连接池的任务,因为线程提交SQL后需要等待数据库返回结果,如果等待的时间越长CPU空闲时间就越长,那么线程数应该设置越大,这样才能更好的利用CPU。

一般总结哦,有其他更好的方式,希望各位留言,谢谢。

 

CPU密集型时,任务可以少配置线程数,大概和机器的cpu核数相当,这样可以使得每个线程都在执行任务

IO密集型时,大部分线程都阻塞,故需要多配置线程数,2*cpu核数

操作系统之名称解释:

某些进程花费了绝大多数时间在计算上,而其他则在等待I/O上花费了大多是时间,

前者称为计算密集型(CPU密集型)computer-bound,后者称为I/O密集型,I/O-bound。

 

Executor框架的最顶层实现是ThreadPoolExecutor类,Executors工厂类中提供的newScheduledThreadPool、newFixedThreadPool、newCachedThreadPool方法其实也只是ThreadPoolExecutor的构造函数参数不同而已。通过传入不同的参数,就可以构造出适用于不同应用场景下的线程池,那么它的底层原理是怎样实现的呢,这篇就来介绍下ThreadPoolExecutor线程池的运行过程。

 

 

 

学习004java并发包&线程池原理分析&锁的深度化(代码片段)

并发包【jdk1.7】同步容器类Vector与ArrayList区别1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已... 查看详情

java多线程线程池和锁的深度化

...owkawa/springBoot_2017/tree/master/spb-demo/src/main/java/com/kawa/thread1.线程池 1.1线程池是什么Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能... 查看详情

javareview-并发编程_threadpoolexecutor原理&源码剖析(代码片段)

文章目录线程池主要解决两个问题类关系图ctl含义----记录线程池状态和线程池中线程个数线程池状态及转换线程池参数线程池类型mainLock&terminationWorker源码分析publicvoidexecute(Runnablecommand)新增线程addWorkder源码分析工作线程Worker... 查看详情

javareview-并发编程_scheduledthreadpoolexecutor原理&源码剖析(代码片段)

...发编程_ThreadPoolExecutor原理&源码剖析我们复习了Java中线程池ThreadPoolExecutor的原理,ThreadPoolExecutor只是Executors工具类的一部分功能。下面来介绍另外一部分功能,也就是ScheduledThreadPoolExecutor的实现,这是一个可以在... 查看详情

jdk线程池原理剖析

这篇文章不打算讲解什么是线程池?线程池怎么用?直接讲解原理1、线程池关键参数解释JDK线程池的实现类是ThreadPoolExecutor,构造函数关键参数解释如下:corePoolSize核心线程,线程池维持的线程数量,即使没有任务执行也会维... 查看详情

线程池原理剖析(代码片段)

---恢复内容开始---前面的我那几个源码截图,大家可以自己点进去看看,共同点都是封装了ThreadPoolExcutor这构造函数无非就是传递的参数不一样~~比如SingleThreadExecutorpublicstaticExecutorServicenewSingleThreadExecutor()returnnewFinalizableDelegatedExe... 查看详情

唯一插件化replugin源码及原理深度剖析--唯一hook点原理(代码片段)

...(郭霖)独家发布上一篇唯一插件化Replugin源码及原理深度剖析–初始化之框架核心,我们说了Replugin的整体框架的初始化,但是因为篇幅的缘故还有Hook系统的ClassLoader和插件的加载没有说,那么我们这一篇就... 查看详情

唯一插件化replugin源码及原理深度剖析--插件的安装加载原理(代码片段)

上一篇唯一插件化Replugin源码及原理深度剖析–唯一Hook点原理在Replugin的初始化过程中,我将他们分成了比较重要3个模块,整体框架的初始化、hook系统ClassLoader、插件的加载,3个模块已经说了两个,在第一篇的最... 查看详情

javareview-并发编程_读写锁reentrantreadwritelock的原理&源码剖析(代码片段)

...eUnitunit)voidunlock()Demo小结ReentrantLockVSReentrantReadWriteLock解决线程安全问题使用ReentrantLock就可以,但是ReentrantLock是独占锁,某时只有一个线程可以获取该锁,而实际中会有写少读多的场景,显然ReentrantLock满足不了这... 查看详情

javareview-并发编程_读写锁reentrantreadwritelock的原理&源码剖析(代码片段)

...eUnitunit)voidunlock()Demo小结ReentrantLockVSReentrantReadWriteLock解决线程安全问题使用ReentrantLock就可以,但是ReentrantLock是独占锁,某时只有一个线程可以获取该锁,而实际中会有写少读多的场景,显然ReentrantLock满足不了这... 查看详情

唯一插件化replugin源码及原理深度剖析--工程职责及大纲(代码片段)

首先简单介绍一些Replugin,Replugin是360开源的Android插件化框架,它在2017年7月开源后,目前已经成为最火热的插件化框架之一,它的特点是唯一Hook,全工程只有一处Hook了系统类。这无形之中让插件化降低了门... 查看详情

唯一插件化replugin源码及原理深度剖析--初始化之框架核心(代码片段)

上一篇:唯一插件化RePlugin源码及原理深度剖析–工程职责提示:请不要忽略代码注释,由于通畅上下逻辑思维,不太重要的部分跳转代码不会全部进去一行行的看,但是会将注释写出来,所以请务必不要... 查看详情

线程池原理剖析(代码片段)

提交一个任务到线程池中,线程池的处理流程如下:1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,... 查看详情

线程同步&线程池

线程同步&线程池线程同步线程不同步会出现的问题:当多个线程操作同一资源时,会出现重复操作和和操作不存在的资源的问题,为了规避这一问题就需要线程的同步操作来实现资源的共同使用。线程同步:当多个线程操作... 查看详情

nodejs原理&源码赏析深度剖析cluster模块源码与node.js多进程(上)(代码片段)

目录一.概述二.线程与进程三.cluster模块源码解析3.1起步3.2入口3.3主进程模块master.js3.4子进程模块child.js四.小结示例代码托管在:http://www.github.com/dashnowords/blogs博客园地址:《大史住在大前端》原创博文目录华为云社区地址:【... 查看详情

javareview-并发编程_独占锁reentrantlock原理&源码剖析(代码片段)

...释放锁voidunlock()方法Demo:使用ReentrantLock来实现一个简单的线程安全的list小结SynchronizedvsReentrantLockReentrantLock概述ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取该锁,其他获取该锁的线程会被阻塞而被放入该... 查看详情

redis分布式锁的深度剖析(转)

https://www.cnblogs.com/luxiaoxun/p/15246087.htmlhttps://zhuanlan.zhihu.com/p/388735542 查看详情

含源码解析,深入java线程池原理

从池化技术到底层实现,一篇文章带你贯通线程池技术。1、池化技术简介在系统开发过程中,我们经常会用到池化技术来减少系统消耗,提升系统性能。在编程领域,比较典型的池化技术有:线程池、连接池、内存池、对象池... 查看详情