Java 线程名称是如何选择的?

在我的应用程序中,我创建了一些线程(可能很多,但同时活动的线程永远不会超过 10 个,而且它们没有做大的工作),并且在它们的执行结束时(我在继续之前加入它们) ),因为他们在循环中工作,他们会做一些时间,但即使他们都完成了(加入),当我检查他们的名字时,Thread-XXX 永远不会重置,所以我想知道这是否正常,我最初认为当一个线程终止时,它会减少 XXX 数字,但这会增加一些可能没有用的东西。

我已经搜索过 javadoc,但我发现的只是这个声明:

每个线程都有一个用于识别的名称。多个线程可能具有相同的名称。如果在创建线程时未指定名称,则会为其生成一个新名称。

那么有人知道在线程 1 到 10 结束后以下将命名为 11 和 + 是否正常?

提前致谢!

编辑:每次我写我的问题时都很奇怪,然后我在开始写你好,但由于某种原因它被删除了我不能在第一个之前添加一行。


动漫人物
浏览 153回答 2
2回答

慕莱坞森

如果让 JRE 选择名称(不将name参数传递给Threadctor),则只需遍历其代码:Thread#Thread() 代码:public Thread() {    init(null, null, "Thread-" + nextThreadNum(), 0);}然后看看Thread#nextThreadNum:/* For autonumbering anonymous threads. */private static int threadInitNumber;private static synchronized int nextThreadNum() {    return threadInitNumber++;}你可以看到这threadInitNumber是一个static永远不会被重置的成员,所以它会随着应用程序运行而不断增加。

慕桂英4014372

如果您使用以下命令创建新线程:Thread thread = new Thread();答案是肯定的,至少在环境方面:java version "10.0.1" 2018-04-17Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)源代码清楚地显示了它:public Thread() {    init(null, null, "Thread-" + nextThreadNum(), 0);}private static synchronized int nextThreadNum() {    return threadInitNumber++;}但这在 API 中并没有保证,所以如果你真的关心它,你可以自定义一个线程工厂。例如:import java.util.concurrent.ThreadFactory;public class DefaultThreadFactory implements ThreadFactory {    private static int threadInitNumber;    private static synchronized int nextThreadNum() {        return threadInitNumber++;    }    @Override    public Thread newThread(Runnable r) {        return new Thread("Thread-" + nextThreadNum());    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java