一、介绍
最近在看一些编码以及设计的规范,觉得有些还是很有用的,在这分享给大家。主要学习阿里的Java开发规范(黄山版),这篇主要是对日常大家使用线程池或者线程时,为何应该制定有意义的线程名称等。
二、分析
在创建线程或线程池时,为线程指定一个有意义的名称是一个很好的实践,主要有以下几个原因:
- 调试和日志记录:当线程出现问题时,一个明确的线程名称可以帮助你更快地定位问题。通过查看线程名称,你可以更容易地跟踪线程的执行路径,这在多线程应用中尤为重要。
- 错误回溯:在复杂的系统中,当错误发生时,一个有意义的线程名称可以提供关于哪个线程导致问题的线索。这使得问题排查和修复变得更为简单。
- 资源管理:在大型系统中,有时可能需要暂停或停止特定的线程。明确的线程名称可以帮助你更容易地识别和操作这些线程。
- 线程池管理:当使用线程池时,为每个线程指定一个有意义的名称可以让你更容易地了解线程池的状态。例如,哪些线程是活动的,哪些线程是空闲的,以及它们正在执行的任务是什么。
- 代码可读性和维护性:即使在单线程应用中,为线程或任务指定一个描述性的名称也可以提高代码的可读性和可维护性。这使得其他开发者更容易理解代码的意图和功能。
- 性能监控:在进行性能测试或系统监控时,明确的线程名称可以帮助你更准确地测量和跟踪线程的行为。
三、案例
下图是黄山版里面的内容,说得很详细并且类型为强制的类型:
然后自己写了一份demo,像平时创建线程执行任务即可拿来直接使用,代码如下所示:
@Slf4j
public class CommonThreadFactory implements ThreadFactory {
private final String namePrefix;
//序号id
private final AtomicInteger nextId = new AtomicInteger(0);
public CommonThreadFactory(String groupName) {
this.namePrefix = "FromCommonThreadFactory`s " + groupName + "-Worker-";
}
@Override
public Thread newThread(@NotNull Runnable task) {
String name = namePrefix + nextId.getAndDecrement();
Thread thread = new Thread(null, task, name);
log.info(thread.getName());
return thread;
}
}
使用方式也非常简单直接创建一个实例,然后调用newThread方法传入对应的任务,我们就可以在控制台看见日志是哪个线程在执行任务,方便咱盘查问题。
下面简单写了一个测试demo:
public static void main(String[] args) {
CommonThreadFactory thread = new CommonThreadFactory("add");
for (int i = 1; i <= 10; i++) {
int finalI = i;
thread.newThread(() -> log.info(String.valueOf(finalI))).start();
}
}
四、总结
总的来说,为线程或线程池指定一个有意义的名称是一种良好的编程习惯,它可以帮助你更好地理解和维护代码,提高系统的稳定性和可维护性。