当前位置: 首页 > news >正文

ThreadFactory

ThreadFactory 是 Java 中一个用于创建线程的接口,它可以自定义线程的创建过程,例如线程的名称、优先级、是否为守护线程等。它是 java.util.concurrent 包的一部分,通常与线程池(ThreadPoolExecutor)一起使用。

线程池默认使用一个简单的 ThreadFactory 来创建线程,但开发者可以实现自己的 ThreadFactory 来满足特定需求,例如为线程设置统一的名称前缀,方便调试和监控。

ThreadFactory 接口定义

@FunctionalInterface
public interface ThreadFactory {Thread newThread(Runnable r);
}

newThread(Runnable r) 方法:
创建并返回一个新的线程,任务由参数 Runnable r 执行。

默认 ThreadFactory 实现

线程池默认使用的 ThreadFactoryExecutors.defaultThreadFactory(),它的实现如下:

public static ThreadFactory defaultThreadFactory() {return new DefaultThreadFactory();
}private static class DefaultThreadFactory implements ThreadFactory {// 静态变量,用于记录线程池的全局编号。AtomicInteger是线程安全的递增计数器。private static final AtomicInteger poolNumber = new AtomicInteger(1);// 当前线程组,用于管理线程的分组关系。private final ThreadGroup group;// 记录当前线程池中线程的编号。每个线程池独立编号,线程编号从1开始。private final AtomicInteger threadNumber = new AtomicInteger(1);// 每个线程池的线程名称前缀,便于调试和区分线程池。private final String namePrefix;// 构造函数:初始化线程组和线程名称前缀。DefaultThreadFactory() {// 获取当前的安全管理器。如果安全管理器存在,则获取线程组,否则获取当前线程的线程组。SecurityManager s = System.getSecurityManager();group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();// 设置线程名称的前缀,格式为 "pool-N-thread-",其中 N 是线程池编号。namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-";}// 重写 ThreadFactory 接口的 newThread 方法,创建一个新线程。@Overridepublic Thread newThread(Runnable r) {// 创建一个新线程,将任务 r 绑定到线程中,并设置线程名称和所属线程组。Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);// 如果新线程是守护线程,将其设置为非守护线程。// 守护线程会在 JVM 中所有非守护线程终止后自动退出,因此这里确保线程池的线程不会被意外回收。if (t.isDaemon())t.setDaemon(false);// 如果线程的优先级不是正常优先级(Thread.NORM_PRIORITY),将其设置为正常优先级。// 这确保线程池中的所有线程具有一致的优先级。if (t.getPriority() != Thread.NORM_PRIORITY)t.setPriority(Thread.NORM_PRIORITY);// 返回新创建的线程。return t;}
}

默认实现的特点
  1. 线程命名规则:
    线程名称格式为:pool-N-thread-M,其中 N 是线程池编号,M 是线程编号。
    例如:pool-1-thread-1pool-1-thread-2

  2. 非守护线程:
    创建的线程默认是非守护线程,这样线程池中的线程不会因为 JVM 退出而被销毁。

  3. 线程优先级:
    默认设置为 Thread.NORM_PRIORITY,即标准优先级。

  4. 线程组:
    线程被分配到当前线程的线程组中。

http://www.lryc.cn/news/499239.html

相关文章:

  • WEB开发: Node.js路由之由浅入深(一) - 全栈工程师入门
  • NES游戏机项目制作笔记(未完成)
  • 云服务器部署upload-labs-docker(文件上传靶场)环境 以及相关报错问题
  • Elasticsearch入门之HTTP基础操作
  • maven聚合项目部署到tomcat上
  • 基于Matlab生育模型和年龄别死亡率的未来人口预测与结构动态分析
  • 公共服务 kkFileView 4.1 文件预览 Docker 一键部署
  • 福昕PDF低代码平台
  • Ubuntu环境安装RabbitMQ
  • 集合ArrayList
  • C#怎么判断电脑是否联网
  • 软件体系结构复习-02 软件体系结构定位及构建
  • 鸿蒙获取 APP 信息及手机信息
  • Linux-V4L2摄像头应用编程
  • 掌握谈判技巧,达成双赢协议
  • Mysql - 存储引擎
  • 借助 CC-Link IE FB 转 Profinet 网关实现西门子 PLC 接入三菱 PLC 系统的解决策略
  • 未完成_RFdiffusion应用案例_从头设计pMHC的结合剂
  • python使用h5py保存数据
  • ubuntu24.04利用selenium控制浏览器的方法
  • Thonny IDE + MicroPython + ESP32 + 0.96寸OLED(IIC) 显示任意字符
  • centos7 扩容
  • FreeRTOS实现UART通信
  • 【从CURD到全栈成长】Java后端如何提升自己?
  • 动态计算加载图片
  • 利用R包QstFstComp包进行Qst-Fst分析
  • ASP.NET Core8.0学习笔记(二十五)——EF Core Include导航数据加载之预加载与过滤
  • ubuntu常用的设置
  • 基于框架的逻辑回归:原理、实现与应用
  • Charts 教程:创建交互式图表的基础