我是靠谱客的博主 等待摩托,最近开发中收集的这篇文章主要介绍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-详细版本核心静态方法其他静态方法非静态方法构造方法参数总结:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部