核心静态方法
registerNatives
- native方法
- 内部调用
- 类加载第一件事就是执行registerNatives
- 内部逻辑待补充
currentThread
- native方法
- 支持外部调用
- 获取当前执行的线程
- 内部逻辑待补充
yield
- native方法
- 放弃当前线程的执行权,重新和其他等待线程竞争
- 内部逻辑待补充
sleep
- native方法
- 使当前执行的线程睡眠(暂时停止执行)指定的毫秒数,依赖于系统计时器和调度器的精度和准确度,
- 吐槽下这个方法public static void sleep(long millis, int nanos),感觉这个方法比较搞笑,有啥用?要精确到纳秒?并且….里面的实现有点扯:看下面的代码,最后还是毫秒..就是个是否+1的操作.好吧,这个类我没理解作者的用途.有知道的评论里聊聊
if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
millis++;
}
sleep(millis);
非静态常用方法
init
* 构造方法调用的
* 初始化一个线程
* name必须指定
* 父线程是当前线程
* 安全管理器是System的
* ThreadGroup为空的话,取安全管理器的,再没有取父线程的
* 检查ThreadGroup,不能为null,当不等于根的时候通过检查,否则检查是否有修改根ThreadGroup的权限
* 检查是否是子类复写了安全敏感且非final的方法,和检查能否设置类加载器的方法
* ThreadGroup未开始线程数(nUnstartedThreads)加一
* 继承父线程是否守护线程,优先级,父线程上下文类加载器
* 设置父线程的ThreadLocal的数据
clone
- 覆写
- 抛出不支持克隆的异常,因为线程无法正在意义上的克隆,创建一个新的线程吧.
start
exit
- 注意不是退出线程
- 而是线程退出前可以调用这个方法来清理资源
interrupt
- 中断这个线程,只有自己能中断,否则会抛安全异常
- 如果被wait,join,sleep阻塞了则会清除中断状态,然后线程收到InterruptedException异常
- 如果被java.nio.channels.InterruptibleChannel的可中断 channel的io操作阻塞,这个channel被关闭,且线程中断中态会被设置,然后线程收到java.nio.channels.ClosedByInterruptException
- 如果在java.nio.channels.Selector里阻塞,线程中断中态会被设置且将立刻返回selection的操作,可能是个非0的值,就好像ava.nio.channels.Selector的wakeup方法被执行的时候
- 如果没有前置条件这个线程中断状态将被设置
isInterrupted
- 测试该线程是否已经终止,无参的不清除中止状态,有参数的可以进行指定是否清除
isAlive
- native
- 测试这个线程是否还活着,一个线程如果已启动但还没有死亡的情况下就是活着的
setPriority
- 设置优先级
- 首先检查访问权限
- 然后检查不能大于最大值(10)也不能小于最小值(1)
- 最后优先级不能大于TheadGroup的最大优先级,否则会设置为TheadGroup的最大值
getThreadGroup
join
- wait0或指定n毫秒
- while(isLive())
构造方法常用参数
构造方法有很多,但最终都是调用的init方法,下面解释构造方法内的参数
ThreadGroup group
- 传参可以为null,为null时自动从SecurityManager取或继承父线程的
Runable target
- 可以为null
- 目标执行的对象,会调用run方法进行执行
String gname
- 线程名称
- 如果构造方法内没有定义,则是自动生成一个,但会调用一个有锁的方法,建议指定线程名称
总结:
- new Thread的时候尽量指定线程名称,否则会有个锁
- 子类尽量不要覆写父类方法,尤其是类加载器等相关方法
- 不覆写父类方法的话,那么直接继承Runable接口就好
- 所以推荐构造方法new Thread(Runable target ,String name)
- 克隆方法不可用
- 判断线程是否被终止,需要islive和isInterrupted一起来判断,否则可能会判断错误
- 里面有很多调试的方法,正常情况下不建议使用
- 已经弃用的方法不要使用
未完待续