为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

动漫人物 2021-11-03 09:58:46
在我的应用程序中,我创建了一些线程(可能很多,但同时活动的线程永远不会超过 10 个,而且它们没有做大的工作),并且在它们的执行结束时(我在继续之前加入它们) ),因为他们在循环中工作,他们会做一些时间,但即使他们都完成了(加入),当我检查他们的名字时,Thread-XXX 永远不会重置,所以我想知道这是否正常,我最初认为当一个线程终止时,它会减少 XXX 数字,但这会增加一些可能没有用的东西。我已经搜索过 javadoc,但我发现的只是这个声明:每个线程都有一个用于识别的名称。多个线程可能具有相同的名称。如果在创建线程时未指定名称,则会为其生成一个新名称。那么有人知道在线程 1 到 10 结束后以下将命名为 11 和 + 是否正常?提前致谢!编辑:每次我写我的问题时都很奇怪,然后我在开始写你好,但由于某种原因它被删除了我不能在第一个之前添加一行。
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

如果让 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永远不会被重置的成员,所以它会随着应用程序运行而不断增加。


查看完整回答
反对 回复 2021-11-03
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

如果您使用以下命令创建新线程:


Thread thread = new Thread();

答案是肯定的,至少在环境方面:


java version "10.0.1" 2018-04-17

Java(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());

    }

}


查看完整回答
反对 回复 2021-11-03
  • 2 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信