一 Thread 源码
private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc,
boolean inheritThreadLocals) {
if (name == null) {
throw new NullPointerException("name cannot be null");
}
this.name = name;
// 获取当前线程
Thread parent = currentThread();
SecurityManager security = System.getSecurityManager();
if (g == null) {
if (security != null) {
g = security.getThreadGroup();
}
if (g == null) {
g = parent.getThreadGroup();
}
}
g.checkAccess();
if (security != null) {
if (isCCLOverridden(getClass())) {
security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
}
}
g.addUnstarted();
this.group = g;
......
}
二 线程的父子关系
Thread 的所有构造函数,最终都会去调用一个静态方法 init.
在线程生命周期中,线程的最初状态为 NEW,没有执行 start 方法之前,它只能算是一个 Thread 的实例,并不意味着一个新的线程被创建,因此 currentThread() 代表的将是创建它的那个线程,我们可以得出下面两个结论。
-
一个线程的创建肯定是另外一个线程完成的。
-
被创建线程的父线程是创建它的线程。
main 函数所在的线程是由 JVM 创建的,也就是 main 线程,那就意味着 main 线程创建的子线程,其父线程是 main 线程。
三 关于线程组
在 Thread 的构造函数中,可以显式地指定线程的 Group,也就是 ThreadGroup。
通过对源码分析,如果在构造 Thread 的时候没有显示指定一个 ThreadGroup,那么子线程线程组将被指定为父线程。
1 测试代码
package concurrent;
public class ThreadConstruction {
public static void main(String[] args) {
// a 没有指定线程组
Thread t1 = new Thread("t1");
// b 创建一个测试线程组
ThreadGroup group = new ThreadGroup("TestGroup");
// c 构造函数中指定线程组
Thread t2 = new Thread(group, "t2");
// main 线程的线程组
ThreadGroup mainThreadGroup = Thread.currentThread().getThreadGroup();
System.out.println("main 线程的线程组:" + mainThreadGroup);
System.out.println("t1 线程的线程组:" + t1.getThreadGroup());
System.out.println("t2 线程的线程组:" + t2.getThreadGroup());
}
}
2 测试结果
main 线程的线程组:java.lang.ThreadGroup[name=main,maxpri=10]
t1 线程的线程组:java.lang.ThreadGroup[name=main,maxpri=10]
t2 线程的线程组:java.lang.ThreadGroup[name=TestGroup,maxpri=10]
3 结论
-
main 线程所在的 ThreadGroup 称为 main。
-
构造一个线程的时候如果没有显示指定 ThreadGroup,那么它将会和父线程同属于一个 ThreadGroup。
在默认设置中,除了子线程会和父线程同属于一个 Group 外,它还会和父线程拥有同样的优先级,同样的 daemon。
本文深入解析了Java线程的初始化过程,强调了线程的父子关系和线程组的概念。通过源码分析,指出线程在未启动前属于创建它的线程的线程组,若未指定线程组,则默认继承父线程的线程组。测试代码和结果进一步证实了这一结论,展示了如何查看线程的线程组,并说明了线程组的默认设定和优先级继承特性。

5053

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



