Thread()
分配一个新的 Thread对象。
Thread(Runnable target)
分配一个新的 Thread对象。
Thread(Runnable target, String name)
分配一个新的 Thread对象。
Thread(String name)
分配一个新的 Thread对象。
Thread(ThreadGroup group, Runnable target)
分配一个新的 Thread对象。
Thread(ThreadGroup group, Runnable target, String name)
分配一个新的 Thread对象,让 target 作为它的运行对象,让 name 作为它的名称,属于 group 引用的线程组。
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
分配一个新的 Thread对象,让 target 作为它的运行对象,让 name 作为它的名称,属于 group 引用的线程组 ,并具有指定的堆栈大小。
Thread(ThreadGroup group, String name)
分配一个新的 Thread对象。
在构造线程的时候可以为线程起一个有特殊意义的名字,这也是比较好的一种做法。尤其是在一个线程比较多的程序中,为线程赋予一个包含特殊意义的名字有助于问题的排查和线程的跟踪,因此,强烈建议在构造线程的时候赋予一个有意义的名字。
下面3个构造函数没有命名,那么它们的默认命名是什么呢?
Thread()
Thread(Runnable target)
Thread(ThreadGroup group, Runnable target)
下面分析一下关键源码
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
/* For autonumbering anonymous threads. */
private static int threadInitNumber;
private static synchronized int nextThreadNum() {
return threadInitNumber++;
}
从上面源码分析,如果没有给线程起名字,它的默认名字是以"Thread-"作为前缀与一个自增数字进行组合,这个自增数字在整个 JVM 进程中将会不断自增。
代码验证
package concurrent;
public class AnonymousThread {
public static void main(String[] args) {
new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
}
}
Thread-0
Thread-1
Thread-2
理论和实际相符合。
下面5个构造函数给线程命名了。
Thread(Runnable target, String name)
Thread(String name)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
Thread(ThreadGroup group, String name)
代码验证
package concurrent;
public class NameThread {
public static void main(String[] args) {
new Thread("线程1") {
@Override
public void run() {
System.out.println("线程名为:" + currentThread().getName());
}
}.start();
}
}
测试结果
线程名为:线程1
不论使用的是默认的函数命名规则,还是指定一个特殊的名字,在线程启动之前还有一个机会可以对线程名进行修改,一旦线程启动,名字将不再被修改。下面是修改线程名字的源码。
public final synchronized void setName(String name) {
checkAccess();
if (name == null) {
throw new NullPointerException("name cannot be null");
}
this.name = name;
if (threadStatus != 0) {
setNativeName(name); // 线程不是 NEW 状态,对名字修改将不生效
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chengqiuming/article/details/122826859
内容来源于网络,如有侵权,请联系作者删除!