源码解析

1.1构造方法
几个常用的变量
group:线程组 ,线程组包含其他的线程组,形成一个树结构,除了初始线程组外,其他的线程组都会有父线程,线程可以访问当前线程组的信息,不能访问父线程组信息
daemon:守护线程,

实际都是运行了init()方法,我们详细介绍下这方法

// ThreadGroup g, 线程组,创建的线程被加入到线程组 ,线程组是线程的集合,线程组组成了一个树,除了初始线程组,每个线程组都有一个parent线程组
// Runnable target,用于回调,Thread 的 run() 方法中会转掉该 target 的 run() 方法,这是线程真正处理事务的地方
//String name 线程名称
// stackSize 创建的线程的栈的大小,如果是0,表明忽略此参数
private void init(ThreadGroup g, Runnable target, String name, long stackSize) {
//调用native层的currentThread函数获取当前环境所在的线程,例如在Activity中,你获取的将是UI线程
Thread parent = currentThread();//native方法调用到了底层的代码
if (g == null) {
g = parent.getThreadGroup();
}

g.addUnstarted();//后台线程数加1
this.group = g;

this.target = target;
this.priority = parent.getPriority();
this.daemon = parent.isDaemon();
setName(name);

init2(parent);

/* Stash the specified stack size in case the VM cares */
this.stackSize = stackSize;
tid = nextThreadID();// //创建线程Id,线程的唯一标识
}

private void init2(Thread parent) {
//获取线程parent的类加载器 ClassLoader类型
this.contextClassLoader = parent.getContextClassLoader();
//设置ClassLoader成员变量
this.inheritedAccessControlContext = AccessController.getContext();//设置访问权限控制环境
if (parent.inheritableThreadLocals != null) {
//给当前线程创建ThreadLocalMap对象,并且继承parent的ThreadLocalMap中的数据
//创建Thread实例的ThreadLoacaleMap。需要用到父线程的ThreadLocaleMap,目的是为了将父线程中的变量副本拷贝一份到当前线程中。
//ThreadLocaleMap是一个Entry型的数组,Thread实例会将变量副本保存在这里面。
this.inheritableThreadLocals = ThreadLocal.createInheritedMap(
parent.inheritableThreadLocals);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
到这里Thread的初始化完成。
————————————————

猜你喜欢

转载自www.cnblogs.com/liyanyan665/p/11402909.html