1.Linux下查看线程命令pseLflinux线程查看命令
2.硬核干货:4W字从源码上分析JUC线程池ThreadPoolExecutor的线程线程实现原理
3.ThreadPoolExecutor简介&源码解析
4.jvmè°è¯å·¥å
·ç±»ä½¿ç¨ (jvisualvm.exe)
5.redis7.0源码阅读:Redis中的IO多线程(线程池)
Linux下查看线程命令pseLflinux线程查看命令
Linux系统是一款著名的开放源代码的 Unix-like 操作系统,它采用内核设计概念,查看查旨在提高系统的源码源码可靠性、稳定性以及安全性。线程线程随着Linux系统崛起,查看查其在服务器端、源码源码android 源码嵌入式应用、线程线程虚拟化、查看查容器等等均日益普及,源码源码现在在基于Linux系统的线程线程运维管理中,管理者开始关注系统资源的查看查利用情况、进程的源码源码运行状态等,其中查看线程是线程线程一项关键性任务。
在Linux系统中,查看查可以使用ps命令查看线程,源码源码ps是process status的缩写,它可以用来查看和统计当前系统中各个进程的信息,按照线程查看进程的命令格式如下:
`ps eLf`
其中,e表明将显示进程的详细信息,L表明显示线程的信息,f表明以树状图的形式显示进程,当然也可以根据自己的实际情况来调整参数。比如,自动发卡源码可以使用`ps -a`等参数来调整查看线程的范围。
查看线程的过程中,可以出现一些看不懂的信息,如进程ID,优先级,内存占用等,不过没关系,这都是可以用man手册来获取更多的信息的。比如,可以使用`man ps`命令来查看关于ps命令的使用帮助。
最后,我们还可以使用其它的一些关于查看进程的命令,比如top,pgrep,pkill等。
总之,在Linux系统中,ps是一个非常实用的工具来查看某个进程下所有线程的运行状态,反映了整个系统状态,帮助我们对进程进行有效地管理。
硬核干货:4W字从源码上分析JUC线程池ThreadPoolExecutor的实现原理
深入剖析JUC线程池ThreadPoolExecutor的执行核心 早有计划详尽解读ThreadPoolExecutor的源码,因事务繁忙未能及时整理。在之前的文章中,我们曾提及Doug Lea设计的plc源码Executor接口,其顶层方法execute()是线程池扩展的基础。本文将重点关注ThreadPoolExecutor#execute()的实现,结合简化示例,逐步解析。 ThreadPoolExecutor的核心功能包括固定的核心线程、额外的非核心线程、任务队列和拒绝策略。它的设计巧妙地运用了JUC同步器框架AbstractQueuedSynchronizer(AQS),以及位操作和CAS技术。以核心线程为例,设计上允许它们在任务队列满时阻塞,或者在超时后轮询,而非核心线程则在必要时创建。 创建ThreadPoolExecutor时,我们需要指定核心线程数、最大线程数、任务队列类型等。当核心线程和任务队列满载时,会尝试添加额外线程处理新任务。线程池的状态控制至关重要,通过整型变量ctl进行管理和状态转换,如RUNNING、飞车源码SHUTDOWN、STOP等,状态控制机制包括工作线程上限数量的位操作。 接下来,我们深入剖析execute()方法。首先,方法会检查线程池状态和工作线程数量,确保在需要时添加新线程。这里涉及一个疑惑:为何需要二次检查?这主要是为了处理任务队列变化和线程池状态切换。任务提交流程中,addWorker()方法负责创建工作线程,其内部逻辑复杂,包含线程中断和适配器Worker的创建。 Worker内部类是线程池核心,它继承自AQS,实现Runnable接口。Worker的构造和run()方法共同确保任务的执行,同时处理线程中断和生命周期的终结。getTask()方法是工作线程获取任务的关键,它会检查任务队列状态和线程池大小,确保资源的有效利用。 线程池关闭操作通过shutdown()、后台管理源码shutdownNow()和awaitTermination()方法实现,它们涉及线程中断、任务队列清理和状态更新等步骤,以确保线程池的有序退出。在这些方法中,可重入锁mainLock和条件变量termination起到了关键作用,保证了线程安全。 ThreadPoolExecutor还提供了钩子方法,允许开发者在特定时刻执行自定义操作。除此之外,它还包含了监控统计、任务队列操作等实用功能,每个功能的实现都是对execute()核心逻辑的扩展和优化。 总的来说,ThreadPoolExecutor的execute()方法是整个线程池的核心,它的实现原理复杂而精细。后续将陆续分析ExecutorService和ScheduledThreadPoolExecutor的源码,深入探讨线程池的扩展和调度机制。敬请关注,期待下文的详细解析。ThreadPoolExecutor简介&源码解析
线程池是通过池化管理线程的高效工具,尤其在多核CPU时代,利用线程池进行并行处理任务有助于提升服务器性能。ThreadPoolExecutor是线程池的具体实现,它负责线程管理和任务管理,以及处理任务拒绝策略。这个类提供了多种功能,如通过Executors工厂方法配置,执行Runnable和Callable任务,维护任务队列,统计任务完成情况等。
创建线程池需要考虑关键参数,如核心线程数(任务开始执行时立即创建),最大线程数(任务过多时限制新线程生成),线程存活时间,任务队列大小,线程工厂以及拒绝策略。JDK提供了四种拒绝策略,如默认的AbortPolicy,当资源饱和时抛出异常。此外,线程池还提供了beforeExecute和afterExecute钩子函数,用于在任务执行前后执行自定义操作。
当任务提交到线程池时,会经历一系列处理流程,包括任务的执行和线程池状态的管理。例如,如果任务队列和线程池满,会根据拒绝策略处理新任务。使用线程池时,需注意线程池容量与状态的计算,以及线程池工作线程的动态调整。
示例中,自定义线程池并重写钩子函数,创建任务后向线程池提交,可以看到线程池如何根据配置动态调整资源。但要注意,如果任务过多且无法处理,可能会抛出异常。源码分析中,submit方法实际上是调用execute,而execute内部包含Worker类和runWorker方法的逻辑,包括任务的获取和执行。
线程池的容量上限并非Integer.MAX_VALUE,而是由ctl变量的低位决定。 Doug Lea的工具函数简化了ctl的操作,使得计算线程池状态和工作线程数更加便捷。通过深入了解ThreadPoolExecutor,开发者可以更有效地利用线程池提高应用性能。
jvmè°è¯å·¥å ·ç±»ä½¿ç¨ (jvisualvm.exe)
ç®æ ï¼ä½¿ç¨JDKèªå¸¦çJVMçæµå·¥å ·è°è¯å å使ç¨æ åµåå æ é®é¢ææ¥ç®è¦è¯´æï¼å¨å®é 项ç®å¼åè¿ç¨ä¸ï¼å¦æ使ç¨å¤çº¿ç¨ï¼ä½æ¯æ²¡ææ§å¶å¥½çº¿ç¨æ°éçæ åµä¸ï¼å°±ä¼åºç°å å å溢åºé®é¢ï¼å¯¼è´åè½æå¡å®æºï¼å¦æ严éå¾å¯è½å¯¼è´æå¡å¨å®æºé®é¢ãå½åºç°å å溢åºæ¶ï¼åªè½çå°ç®åçå å溢åºæ¥å¿ï¼ææ¥é®é¢æ¯«æ 头绪ï¼ä¸ç¥éåªé线ç¨åºç°é®é¢ï¼è¿æ ·å°±å¾é¾è§£å³é®é¢ï¼
è¿æ¶æ们就å¯ä»¥éè¿JDKèªå¸¦çJVMçæ§å·¥å ·æ¥çæ¯ä¸ªçº¿ç¨ççå½å¨æ以åç¸å ³æºç 追溯ï¼è¿æ ·å°±å¯ä»¥æ¸ æ¥æäºççæ¸ é®é¢åºç°å¨åªéï¼ç¶åæ ¹æ®å®é æ åµè§£å³é®é¢ï¼
éè¿ä¸å¾å¯ä»¥çå°æ¬å°æå¡ä¸ææç线ç¨åç¸å ³ç¶æï¼å¦æ线ç¨åºç°é®é¢éè¦ææ¥æ¶ï¼éè¦æ¥çå ·ä½æ§è¡çæ¹æ³ï¼é£ä¹å°±éè¦å¿«ç §æ¹å¼æ¥çï¼å ·ä½æ¹å¼å¦ä¸ï¼
ç¹å»æ½æ ·å¨ï¼ç¶åéæ©CPUæ½æ ·ï¼ç¹å»åæ¢ï¼å¨ç¹å»ä¸é¢çå¿«ç §æé®ï¼å°±å¯ä»¥è·åææææ线ç¨çä¸æ¬¡å¿«ç §ï¼ç¶åå°±å¯ä»¥çå°æ¯ä¸ªçº¿ç¨æ§è¡çæºç ï¼å ·ä½æä½å¦ä¸å¾ï¼
éè¿ä¸è¿°çæä½å³å¯æ¥ç线ç¨å ·ä½æ¶åçæºç ï¼ä»èææ¥é®é¢ï¼
ä¸é¢è¯´çæ¯æ¬å°æå¡çæµï¼ä½æ¯æå¾å¤æ åµæ¬å°æå¡æ¯ææ¥ä¸å°é®é¢çï¼åªæå¨æå¡å¨ä¸é¢æè½çåºé®é¢ï¼é£ä¹æ们就éè¦è¿ç¨è¿æ¥æå¡å¨ä¸é¢æå¡ï¼è¿è¡çæ§ï¼æ¥çå ·ä½çº¿ç¨çè¿è¡æ åµåæºç åæ
è¿ç¨é ç½®éè¦å¨å¯å¨Javaæå¡çæ¶åï¼å¨å¯å¨å½ä»¤ä¸é¢æ·»å æå®å¯å¨åæ°ï¼è¿éæä¾çå½ä»¤æ¯æ£å¸¸æ åµä¸å®æ´çå¯å¨jarå çå½ä»¤ï¼å ·ä½å½ä»¤åæ°ä¹å¾æ¸ æ¥ï¼å½ä»¤å¦ä¸ï¼
ps:portæ¯çæ§æéç端å£ï¼ä¹å°±æ¯å¯å¨æå¡æå®ç端å£ï¼ä½æ¯ç«¯å£è¦å¯¹å¤å¼æ¾ï¼ä¸è¬çæ®éæå¡ç«¯å£æ¯ä¸ä¼å¯¹å®å¼æ¾çï¼è¿ä¸ç¹éè¦æ³¨æ
hostnameæ¯å¯¹åºçæ§çipï¼æè¿éç¨çå°±æ¯æå¡å¨ipï¼å¦æè¿æ¥ä¸ä¸çæ åµä¸ï¼å¯ä»¥å°è¯ä½¿ç¨ hostname -i è·åç对åºipï¼å ·ä½æ åµå ·ä½åæ
ç¶åå¯å¨æå¡ä¹åï¼éä¸è¿ç¨å³é®æ·»å è¿ç¨ä¸»æºï¼è¾å ¥è¿ç¨ä¸»æºipåç¡®å®å³å¯ï¼ç¶åéæ©ä¸»æºipï¼å³é®æ·»å JMXè¿æ¥ï¼è¾å ¥è®¾å®ç端å£å·ï¼ç¹å»ç¡®å®å³å¯ï¼ç¶åå°±å¯ä»¥çæ§è¿ç¨æå¡å¨äºï¼æ¥ä¸æ¥çæ¥ç线ç¨çæ åµãçæ§æå¡æ åµåææ¥é®é¢ä½¿ç¨å¿«ç §ï¼å°±åä¸é¢æ¬å°çæä½ä¸æ ·äºï¼
ç»è¿ä¸è¿°æä½å°±å¯ä»¥éè¿JDKèªå¸¦ççæ§è½¯ä»¶ï¼è¿è¡çæ§Javaç¨åºçè¿è¡æ åµä»¥åæå¡å¨çè¿è¡æ åµå¦ï¼
æ¬äººåèï¼å¦æé®é¢æ¬¢è¿å¤§å®¶ææ£ï¼å ±åè¿æ¥ï¼
redis7.0源码阅读:Redis中的IO多线程(线程池)
Redis服务端处理客户端请求时,采用单线程模型执行逻辑操作,然而读取和写入数据的操作则可在IO多线程模型中进行。在Redis中,命令执行发生在单线程环境中,而数据的读取与写入则通过线程池进行。一个命令从客户端接收,解码成具体命令,根据该命令生成结果后编码并回传至客户端。 Redis配置文件redis.conf中可设置开启IO多线程。通过设置`io-threads-do-reads yes`开启多线程,同时配置`io-threads 2`来创建两个线程,其中一个是主线程,另一个为IO线程。在网络处理文件networking.c中,`stopThreadedIOIfNeeded`函数会判断当前需要执行的命令数是否超过线程数,若少于线程数,则不开启多线程模式,便于调试。 要进入IO多线程模式,运行redis-server命令,然后在调试界面设置断点在networking.c的`readQueryFromClient`函数中。使用redis-cli输入命令时,可以观察到两个线程在运行,一个为主线程,另一个为IO线程。 相关视频推荐帮助理解线程池在Redis中的应用,包括手写线程池及线程池在后端开发中的实际应用。学习资源包括C/C++ Linux服务器开发、后台架构师技术等领域,需要相关资料可加入交流群获取免费分享。 在Redis中,IO线程池实现中,主要包括以下步骤:读取任务的处理通过`postponeClientRead`函数,判断是否启用IO多线程模式,将任务加入到待执行任务队列。
主线程执行`postponeClientRead`函数,将待读客户端任务加入到读取任务队列。在多线程模式下,任务被添加至队列中,由IO线程后续执行。
多线程读取IO任务`handleClientsWithPendingReadsUsingThreads`通过解析协议进行数据读取,与写入任务的多线程处理机制相似。
多线程写入IO任务`handleClientsWithPendingWritesUsingThreads`包括判断是否需要启动IO多线程、负载均衡分配任务到不同IO线程、启动IO子线程执行写入操作、等待IO线程完成写入任务等步骤。负载均衡通过将任务队列中的任务均匀分配至不同的线程消费队列中,实现无锁化操作。
线程调度部分包含开启和关闭IO线程的功能。在`startThreadedIO`中,每个IO线程持有锁,若主线程释放锁,线程开始工作,IO线程标识设置为活跃状态。而在`stopThreadedIO`中,若主线程获取锁,则IO线程等待并停止,IO线程标识设置为非活跃状态。