我是靠谱客的博主 等待摩托,最近开发中收集的这篇文章主要介绍JAVA源码笔记(jdk 1.7.0_75)--Thread-详细版本核心静态方法其他静态方法非静态方法构造方法参数总结:,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
核心静态方法
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);
- -
其他静态方法
nextThreadNum
- 加锁
- +1返回
- 为未指定线程名称的线程初始化的时候设置默认线程名称使用
- 所以尽量直接指定线程名称,否则这里有个锁
nextThreadID
- 加锁
- +1返回
- 用于新增线程时分配一个id
isCCLOverridden
- 在init方法中调用了
- 验证当前类(可能是子类)可以在不违反安全约束的情况下被创建:子类必须不能覆写安全敏感的非final方法,或者其他enableContextClassLoaderOverride 的权限已经校验过,
- 如果是Thread类.直接通过
- 其他的类的话都需要进行校验
auditSubclass
- 执行反射检查给定的子类是否覆盖了安全敏感的非final方法,如果复写了任一这些方法返回true,否则false
interrupted
- 测试当前线程是否被阻塞
- interrupted status将会被清除掉,换句话说,如果这个方法调用两次,第一次是true的话,第二次返回fasle(除非在第一次调用清掉状态后之后咋第二次调用之前重新中断)
- 一个线程中断忽略,因为线程在中断的时候不活着了,将会影响到这个方法返回false
- 看了上面这个凌乱的解释,一般还是别用这个方法判断是否被中断了吧
activeCount
- 返回当前线程的TheadGroup的活动线程数(TheadGroup.nthreads),会递归计算ThreadGroup下所有的ThreadGroup的线程数
- 返回值只是一个估计值,可能会在遍历内部数据结构的过程中动态的不断变化.也可能会被系统的某些线程影响
enumerate
- 复制指定的数据所有活动的线程到当前线程的ThreadGroup和子的ThreadGroup内
- 这个方法直接执行的ThreadGroup的enumerate方法
- 一个应用应该使用activeCount来获取这个array应该多大的一个估计值,无论这个数据是否太短可以hold住所有的线程,
- 多余的线程会被静默的忽略.如果在当前线程的TheadGroup以及子的ThreadGroup获取所有活动的线程是至关重要的;执行者需要严格检查返回值是否小于tarray的长度
- 由于这个方法内在的竞争条件,推荐仅仅用来调试和监控进程
dumpStack
- 输出当前线程堆栈的trace的到独立的错误流,方法仅仅用来调试
holdsLock
- 但线程锁了指定对象的时候返回true
- 这个方法是设计用来允许用awwert来对当前线程已经hold了一个指定的锁
getAllStackTraces
- 返回所有线程的堆栈回溯信息,
- 仅用于调试
dumpThreads
- native
- 待定
getThreads
- native,待定
setDefaultUncaughtExceptionHandler
getDefaultUncaughtExceptionHandler
processQueue
- 根据queue的元素移除指定的map内的元素
- -
非静态方法
init
* 构造方法调用的
* 初始化一个线程
* name必须指定
* 父线程是当前线程
* 安全管理器是System的
* ThreadGroup为空的话,取安全管理器的,再没有取父线程的
* 检查ThreadGroup,不能为null,当不等于根的时候通过检查,否则检查是否有修改根ThreadGroup的权限
* 检查是否是子类复写了安全敏感且非final的方法,和检查能否设置类加载器的方法
* ThreadGroup未开始线程数(nUnstartedThreads)加一
* 继承父线程是否守护线程,优先级,父线程上下文类加载器
* 设置父线程的ThreadLocal的数据
clone
- 覆写
- 抛出不支持克隆的异常,因为线程无法正在意义上的克隆,创建一个新的线程吧.
start
- 调用了start0
- 设置start状态
start0
- native方法
- 内部逻辑待补充
exit
- 注意不是退出线程
- 而是线程退出前可以调用这个方法来清理资源
stop
- 废弃的方法,暂时不写
destroy
- 废弃的方法,暂时不写
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
- 测试这个线程是否还活着,一个线程如果已启动但还没有死亡的情况下就是活着的
suspend
- 废弃方法,暂不写
resume
- 废弃方法,暂不写
setPriority
- 设置优先级
- 首先检查访问权限
- 然后检查不能大于最大值(10)也不能小于最小值(1)
- 最后优先级不能大于TheadGroup的最大优先级,否则会设置为TheadGroup的最大值
getPriority
setName
- 会检查权限
getName
getThreadGroup
- 线程死亡(stop)的时候会返回null
countStackFrames
- 废弃的方法,暂时不写
join
- wait0或指定n毫秒
setDaemon
- 设置线程是否为守护线程,JVM必须在只剩下守护线程的情况下才能退出
- 检查权限和是否活着
isDaemon
checkAccess
- 检查当前运行的线程是否有权限修改这个线程
toString
- 返回线程的字符串描述,包含线程名称,优先级,线程组的名称
getContextClassLoader
setContextClassLoader
getStackTrace
- 返回从当前线程中导出的堆栈回溯,
- 如果线程没有启动,启动了按还没有调度执行,或者已经终止的时候这个方法会返回一个长度为0的数组
- 如果返回的数组是一个不为0的数组,第一个元素是堆栈的top,也就是最近执行方法,左后一个元素在堆栈的底部,是最早执行的方法
- 会做安全检查
getId
getState
- 这个是设计用来做系统状态监控用的,不是用来做同步控制的
getUncaughtExceptionHandler
- 返回未捕获的异常处理器,没定义则返回ThreadGroup(继承了这个接口)
setUncaughtExceptionHandler
dispatchUncaughtException
- 分配一个未捕获的异常给处理器,这个方法只由JVM调用
setPriority0
stop0
suspend0
resume0
interrupt0
setNativeName
构造方法参数
构造方法有很多,但最终都是调用的init方法,下面解释构造方法内的参数
ThreadGroup group
- 传参可以为null,为null时自动从SecurityManager取或继承父线程的
Runable target
- 可以为null
- 目标执行的对象,会调用run方法进行执行
## String gname
- 线程名称
- 如果构造方法内没有定义,则是自动生成一个,但会调用一个有锁的方法,建议指定线程名称
AccessControlContext acc
- 访问控制上下文
- 一般用不到
总结:
- new Thread的时候尽量指定线程名称,否则会有个锁
- 子类不能尽量不要复写父类方法,尤其是类加载器等相关方法
- 克隆方法不可用
- 判断线程是否被终止,需要islive和isInterrupted一起来判断,否则可能会判断错误
-
未完待续
最后
以上就是等待摩托为你收集整理的JAVA源码笔记(jdk 1.7.0_75)--Thread-详细版本核心静态方法其他静态方法非静态方法构造方法参数总结:的全部内容,希望文章能够帮你解决JAVA源码笔记(jdk 1.7.0_75)--Thread-详细版本核心静态方法其他静态方法非静态方法构造方法参数总结:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复