Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制。
创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象。
构造方法核心
如前面两个图所示,Thread共有8个构造方法
而且所有的构造方法都依赖于init方法
private void init(ThreadGroup g, Runnable target, String name,long stackSize)
所以换一个角度思考,可以认为只有一个构造方法
这“唯一的一个构造方法”调用的是五个参数的init方法
所以说,尽管有8个构造方法,但是内部底层调用的都是init方法
这是一种编码规范与设计思维---“构造方法中不设置初始化逻辑,如果需要将初始化逻辑进行封装”
对于Thread类来说,五个参数的init方法,就是这个初始化逻辑的封装方法
所有的构造方法都依赖他。
最大集合
从init的参数方法签名来看,构造一个Thread最多需要五个值,也就是说对于一个基本的Thread,能够运行的Thread,最大集合为五个;
但是通过构造方法可以看得出来,全部都是调用的四个版本的init方法,都没有传递AccessControlContext acc,在五个参数的版本中有设置默认值。
所以目前(1.8)支持Thread运行的构造参数最大集合个数为四,他们分别是:
- ThreadGroup g
- Runnable target
- String name
- long stackSize
ThreadGroup g
ThreadGroup表示该线程所在的线程组,如果没有显式指定,那么底层调用init时,传递的参数为null
如果参数传递为null的话,ThreadGroup会有默认值的设置
如果有安全管理器,会请求管理器进行设置,如果安全管理器不存在或者根本就没有明确的指示,那么将会获取父线程的所在的线程组
父线程就是创建他的线程
Thread parent = currentThread();
所以,ThreadGroup是非必填项,如果不进行设置,会有默认初始值
Runnable target
Runnable用于封装线程任务
Runnable 是一个接口,只有一个run方法,任务的具体内容封装在run方法中





