java.lang.Thread类中提供了九种构造方法
public Thread() |
public Thread(Runnable target) |
public Thread(ThreadGroup group, Runnable target) |
public Thread(String name) |
public Thread(ThreadGroup group, String name) |
public Thread(Runnable target, String name) |
public Thread(ThreadGroup group, Runnable target, String name) |
public Thread(ThreadGroup group, Runnable target, String name,long stackSize) |
public Thread(ThreadGroup group, Runnable target, String name,long stackSize, boolean inheritThreadLocals) |
2.1线程的命名
每个线程都会有自己的名字,我们可以自定义名字,也可以使用默认名字,一般为了方便排除问题我们会采用自定义命名线程
2.1.1线程的默认命名
- public Thread()
- public Thread(Runnable target)
- public Thread(ThreadGroup group, Runnable target)
这三个构造函数在创建线程时采用自定义命名,我们通过Thread.currentThread().getName()可获得当前线程的名称,这里直接看一下源码
这里主要看name:这里


因此我们创建的线程的名称从Thread0开始依次加一
public class demo {
public static void main(String[] args) {
Thread thread1 = new ThreadDemo();
Thread thread2 = new ThreadDemo();
Thread thread3 = new ThreadDemo();
Thread thread4 = new ThreadDemo();
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
class ThreadDemo extends Thread{
@Override
public void run() {
System.out.println("线程名称"+Thread.currentThread().getName());
}
}
运行结果

2.1.2命名线程
- public Thread(String name)
- public Thread(ThreadGroup group, String name)
- public Thread(Runnable target, String name)
- public Thread(ThreadGroup group, Runnable target, String name)
- public Thread(ThreadGroup group, Runnable target, String name,long stackSize, boolean inheritThreadLocals)
我举一个例子,剩下的家人们自己来

public class demo {
public static void main(String[] args) {
Thread thread = new Thread("自定义名称"){
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
thread.start();
}
}
2.1.3修改线程名称
在线程启动之前也就是,start之前,我们还有一次机会为线程命名,一旦线程启动就我发命名了,这个容易李姐,就像和谐号都出发了你要它改名
我们可以使用setName方法设置
下面时setName源码

2.2线程的父子关系
一个线程的创建肯定是有另一个线程完成的
被创建线程的父线程是创建它的线程
2.3Thread与ThreadGroup
在构造函数中我们可以指定线程的线程组,如果不指定线程组,线程将默认加入父线程的线程组
下面是Thread.init方法,印证了我们上面所说
//取当前创建的线程作为该线程的父线程
Thread parent = currentThread();
SecurityManager security = System.getSecurityManager();
if (g == null) {
/* Determine if it's an applet or not */
/* If there is a security manager, ask the security manager
what to do. */
if (security != null) {
g = security.getThreadGroup();
}
/* If the security doesn't have a strong opinion of the matter
use the parent thread group. */
if (g == null) {
g = parent.getThreadGroup();
}
}
我们来练习一下
public class test{
public static void main(String[] args){
//创建一个不指定组的线程
Thread t1 = new Thread("t1");
//创建一个线程组
ThreadGroup group = new ThreadGroup("TestGroup");
//创建一个指定线程组的线程
Thread t2 = new Thread(group,"t2");
//获取main线程的线程组
ThreadGroup mainGroup = Thread.currentThread().getTreadGroup();
System.out.println("main的线程组"+mainGroup);
System.out.println("t1的线程组"+t1.getThreadGroup());
System.out.println("t2的线程组"+t2.getThreadGroup());
}
}
2.4Thread与Runnable
Thread负责线程本身相关的职责和控制,Runnable则负责逻辑执行单元的部分(之前说过Runnable没有start方法,所以只负责逻辑执行单元部分)
本文详细解读Java线程的九种构造方法,重点讲解线程命名规则,自定义命名、默认命名与线程父子关系。深入理解ThreadGroup的作用及如何设置线程所属组。
4333

被折叠的 条评论
为什么被折叠?



