Java线程命名问题解决
前言
网上冲浪时刷到线程池的文章,想想看自己好像还没在实际场景中设置过线程名称,小小研究一下。
研究过程
默认命名
创建的线程都会有自己的名字,如果不设置,程序会给线程默认的名字,如Thread-0
Thread t = new Thread(() -> {
System.out.println(Thread.currentThread().getName());
});
t.start();
// Thread-0
设置线程名称,应当有个理由。现在一个项目中有订单相关线程池、有付款相关线程池,给线程命名,可以容易区分线程种类。如Thread-order-0、Thread-fund-0
Thread内部实现原理
首先我们打开Thread类,属性name就是线程的名称。
public
class Thread implements Runnable {
/* Make sure registerNatives is the first thing <clinit> does. */
private static native void registerNatives();
static {
registerNatives();
}
// 线程名字
private volatile String name;
private int priority;
private Thread threadQ;
private long eetop;
// ...省略
}
测试:

抽象实现
首先实现线程工厂构造器,主要构造线程工厂对象
@Getter
public class ThreadFactoryBuilder {
private String nameFormat;
public ThreadFactoryBuilder setNameFormat(String nameFormat) {
this.nameFormat = nameFormat;
return this;
}
public ThreadFactory build(){
return buildThreadFactory(this);
}
public static ThreadFactory buildThreadFactory(ThreadFactoryBuilder builder) {
final AtomicInteger counter = new AtomicInteger(0);
return r -> {
Thread t = new Thread(r);
// 这里设置了线程池名称,使用counter区分不同线程
t.setName(String.format(builder.getNameFormat(), counter.getAndIncrement()));
return t;
};
}
}
查看源码ExecutorService源码,发现预留了线程工厂的入参
// ExecutorService newFixedThreadPool 预留了ThreadFactory
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory);
}
测试代码正确性:
ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("测试命名线程-%d").build();
ExecutorService executor = Executors.newFixedThreadPool(5, threadFactory);
for (int i = 0; i < 10; i++) {
executor.execute(() -> {
try {
sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName());
});
}
// 测试命名线程-3
// 测试命名线程-2
// 测试命名线程-1
// 测试命名线程-0
// 测试命名线程-4
// 测试命名线程-0
// 测试命名线程-2
// 测试命名线程-1
// 测试命名线程-3
// 测试命名线程-4
Java线程命名问题解决的更多相关文章
- Java线程的5个使用技巧
萝卜白菜各有所爱.像小编我就喜欢Java.学无止境,这也是我喜欢它的一个原因.日常工作中你所用到的工具,通常都有些你从来没有了解过的东西,比方说某个方法或者是一些有趣的用法.比如说线程.没错,就是线程 ...
- 怎样分析java线程堆栈日志
注: 该文章的原文是由 Tae Jin Gu 编写,原文地址为 How to Analyze Java Thread Dumps 当有障碍,或者是一个基于 JAVA 的 WEB 应用运行的比预期慢的时 ...
- Java线程池使用和分析(一)
线程池是可以控制线程创建.释放,并通过某种策略尝试复用线程去执行任务的一种管理框架,从而实现线程资源与任务之间的一种平衡. 以下分析基于 JDK1.7 以下是本文的目录大纲: 一.线程池架构 二.Th ...
- Java内存模型与Java线程实现原理
硬件的效率与一致性 基于高速缓存的存储交互很好的解决了处理器和内存的速度矛盾,但是也为计算机系统带来了更高的复杂度,因为引入了一个新问题:缓存一致性. 在多处理器系统中,每个处理器都有自己的高速缓存, ...
- Java 线程和多线程执行过程分析
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- Java线程池ThreadPoolExecutor使用和分析(一)
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- java线程池ThreadPoolExecutor类使用详解
在<阿里巴巴java开发手册>中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量:另一方面线程的细节管理交给线 ...
- Java线程池学习心得
一.普通线程和线程池的对比 new Thread的弊端如下: a. 每次new Thread新建对象性能差.b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或o ...
- Java线程模型
并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论并发,大多数都与线程脱不开关系. 线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开, ...
- Java线程池使用和源码分析
1.为什么使用线程池 在多线程编程中一项很重要的功能就是执行任务,而执行任务的方式有很多种,为什么一定需要使用线程池呢?下面我们使用Socket编程处理请求的功能,分别对每种执行任务的方式进行分析. ...
随机推荐
- 贝壳找房携手 Flutter,为三亿家庭提供更好的居住服务 | Flutter 开发者故事
贝壳找房是科技驱动的新居住服务平台,致力于在二手房.新房.租房以及装修等居住领域为三亿家庭提供全方位的品质居住服务.如此庞大的用户群体,自然也有着十分多样和复杂的使用场景和需求.以往使用原生开发模式时 ...
- 利用 Page Visibility API 优化网页性能与用户体验
在现代 Web 开发中,用户可能会频繁切换标签页,或让网页处于后台运行.为了避免不必要的资源浪费并提升用户体验,合理利用 Page Visibility API 可以在页面不可见时暂停或减少资源的消耗 ...
- Element PRO 破解版 3.18.1版插件
百度网盘提取 链接:https://pan.baidu.com/s/1KKOm7O1ghhIoYNiQPdzG_Q 提取码:1234
- 《Vue.js 设计与实现》读书笔记 - 第10章、双端 Diff 算法
第10章.双端 Diff 算法 10.1 双端比较的原理 上一章的移动算法并不是最优的,比如我们把 ABC 移动为 CAB,如下 A C B --> A C B 按照上一章的算法,我们遍历新的数 ...
- 精彩回顾|【2023 ACDU 中国行·深圳站】数据库主题交流活动成功举办!
6月30日下午,[ACDU 中国行·深圳站]在深圳回酒店圆满落下帷幕.本次活动由中国数据库联盟(ACDU)联合墨天轮社区主办,围绕「数据库前沿技术揭秘及应用」这一主题,七位数据库行业的领军人物从数据库 ...
- WTConv:小参数大感受野,基于小波变换的新型卷积 | ECCV'24
近年来,人们尝试增加卷积神经网络(CNN)的卷积核大小,以模拟视觉Transformer(ViTs)自注意力模块的全局感受野.然而,这种方法很快就遇到了上限,并在实现全局感受野之前就达到了饱和.论文证 ...
- 洛谷P1596水坑计数
[USACO10OCT] Lake Counting S 题目链接 题面翻译 由于近期的降雨,雨水汇集在农民约翰的田地不同的地方.我们用一个 \(N\times M(1\leq N\leq 100, ...
- 最新Sql语句来啦
创建数据库 CREATE DATABASE 数据库名称; 删除数据库 DROP DATABASE 数据库名称; 创建新表 create table 表名(列 类型 ,列 类型 ,..); 根据已有的表 ...
- 如何将rust日志输出到android终端
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议.转载请注明来自 唯你 背景 在 Rust 中,使用 println!打印日志时,输出实际上是发送到标准输出(stdout),而 ...
- ConsulManager应用场景2:如何优雅的使用Consul管理Blackbox站点监控
[ConsulManager介绍] Consul字段设计说明 所有数据存在一个名为blackbox_exporter的Services项中,每个监控目标为一个子Service. 每个Service使用 ...