如何选择Java线程名称?

时间:2018-10-06 13:43:40

标签: java multithreading

在我的应用程序中,我创建了一些线程(也许很多,但是同时运行的线程永远不会超过10个,并且它们并没有做大的工作),并在执行结束时(我将它们全部加入)在我继续之前),由于他们正在循环执行工作,因此他们会花一些时间,但是即使当我检查他们的名字时,他们都已经完成(加入),但Thread-XXX从未重置,所以我想知道是否正常情况下,我最初以为,当线程终止时,它会减少XXX号,但是这样做可能会增加一些用处。

我已经搜索了javadoc,但发现的只有以下语句:

  

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

那么有人知道在线程1到10结束之后以下内容将被命名为11和+吗?

谢谢!

编辑:同样,每次我写问题时都会很奇怪,然后我一开始就写“ Hello”,但是由于某种原因它被删除了,我无法在第一个行之前添加一行。

2 个答案:

答案 0 :(得分:4)

如果让JRE选择名称(不将name参数传递给Thread ctor),则只需遍历其代码即可:

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成员,永远不会重置,因此对于应用程序运行,它将不断增加。

答案 1 :(得分:3)

如果您使用以下方法创建新线程:

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++;
}

源代码清楚地表明了这一点:

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

但这在API中并不保证,因此,如果您确实关心它,则可以自定义线程工厂。例如:

    server {
        listen 80;
        server_name 203.0.113.2;

        proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

        location / {
            proxy_pass http://203.0.113.1:3000;
        }
    }