首页 > 编程 > Java > 正文

JAVA源码笔记(jdk 1.7.0_75)--Thread-详细版本

2019-11-08 20:11:12
字体:
来源:转载
供稿:网友

核心静态方法

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一起来判断,否则可能会判断错误 未完待续
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表