在我的应用程序中,我创建了一些线程(也许很多,但是同时运行的线程永远不会超过10个,并且它们并没有做大的工作),并在执行结束时(我将它们全部加入)在我继续之前),由于他们正在循环执行工作,因此他们会花一些时间,但是即使当我检查他们的名字时,他们都已经完成(加入),但Thread-XXX从未重置,所以我想知道是否正常情况下,我最初以为,当线程终止时,它会减少XXX号,但是这样做可能会增加一些用处。
我已经搜索了javadoc,但发现的只有以下语句:
每个线程都有一个名称,以供识别。一个以上的线程可能具有相同的名称。如果在创建线程时未指定名称,则会为其生成一个新名称。
那么有人知道在线程1到10结束之后以下内容将被命名为11和+吗?
谢谢!
编辑:同样,每次我写问题时都会很奇怪,然后我一开始就写“ Hello”,但是由于某种原因它被删除了,我无法在第一个行之前添加一行。
答案 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;
}
}