码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 如何优雅的创建线程


    在这里插入图片描述

    文章目录

        • 1.创建单线程
        • 2.单线程抽象类
        • 3.线程池原理
        • 4.线程池封装
        • 5.线程名很重要

    1.创建单线程

    1. Thread
    2. Runnable

    2.单线程抽象类

    抽象类 ServiceThread

    在这里插入图片描述

    在这里插入图片描述
    实现类的编程模版类似

    在这里插入图片描述

    我们仅仅需要继承抽象类,并实现 getServiceName 和 run 方法即可。启动的时候,调用 start 方法 , 关闭的时候调用 shutdown 方法

    3.线程池原理

    线程池是一种基于池化思想管理线程的工具,线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。

    在这里插入图片描述

    4.线程池封装

    在 RocketMQ 里 ,网络请求都会携带命令编码,每种命令映射对应的处理器,而处理器又会注册对应的线程池。

    在这里插入图片描述

    当服务端 Broker 接收到发送消息命令时,都会有单独的线程池 sendMessageExecutor 来处理这种命令请求。

    在这里插入图片描述

    BrokerFixedThreadPoolExecutor 构造函数包含六个核心参数:

    1. 核心线程数和最大线程数相同 ,数量是:cpu核数和4比较后的最小值;
    2. 空闲线程的回收的时间限制,默认1分钟;
    3. 发送消息队列,有界队列,默认10000;
    4. 线程工厂 ThreadFactoryImpl ,定义了线程名前缀:SendMessageThread_ 。

    RocketMQ 实现了一个简单的线程工厂:ThreadFactoryImpl,线程工厂可以定义线程名称,以及是否是守护线程 。

    在这里插入图片描述

    开源项目 Cobar ,Xmemcached,Metamorphosis 中都有类似线程工厂的实现

    5.线程名很重要

    我们看到 RocketMQ 中,无论是单线程抽象类还是多线程的封装都会配置线程名 ,因为通过线程名,非常容易定位问题,从而大大提升解决问题的效率。

    定位的媒介常见有两种:日志文件和堆栈记录。

    日志文件

    经常处理业务问题的同学,一定都经常与日志打交道。

    在这里插入图片描述

    • 查看 ERROR 日志,追溯到执行线程, 要是线程池隔离做的好,基本可以判断出哪种业务场景出了问题;
    • 通过查看线程打印的日志,推断线程调度是否正常,比如有的定时任务线程打印了开始,没有打印结束,推论当前线程可能已经挂掉或者阻塞。

    堆栈记录

    jstack 是 java 虚拟机自带的一种堆栈跟踪工具 ,主要用来查看 Java 线程的调用堆栈,线程快照包含当前 java 虚拟机内每一条线程正在执行的方法堆栈的集合,可以用来分析线程问题。

    jstack -l 进程pid
    
    • 1

    在这里插入图片描述

    1. 当前 jvm 进程中的线程数量和线程分类是否在预期的范围内;
    2. 系统接口超时或者定时任务停止的异常场景下 ,分析堆栈中是否有锁未释放,或者线程一直等待网络通讯响应;
    3. 分析 jvm 进程中哪个线程占用的 CPU 最高。
  • 相关阅读:
    java复习-线程常用操作方法
    如何确定IP地址的具体位置?
    【ROS2】Moveit2-humble 详细安装过程及问题解决
    web 面试高频考点 —— JavaScript 篇(一)【JS的三座大山 】 变量类型和计算、原型和原型链、作用域和闭包、异步
    Scratch3之AI集成 - flappy bird AI版本
    区块链技术:NFG元宇宙电商模式
    计算机毕业设计 SSM实验室故障报修系统 故障维修系统 故障信息管理系统
    为什么C++中的继承比Java设计的要复杂,原因竟出在这儿?
    【Axure视频教程】item和targetitem函数
    Spring 七大模块介绍
  • 原文地址:https://blog.csdn.net/qq_43141726/article/details/126771412
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号