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);

非静态常用方法

init

 * 构造方法调用的
 * 初始化一个线程
 * name必须指定
 * 父线程是当前线程
 * 安全管理器是System的
 * ThreadGroup为空的话,取安全管理器的,再没有取父线程的
 * 检查ThreadGroup,不能为null,当不等于根的时候通过检查,否则检查是否有修改根ThreadGroup的权限
 * 检查是否是子类复写了安全敏感且非final的方法,和检查能否设置类加载器的方法
 * ThreadGroup未开始线程数(nUnstartedThreads)加一
 * 继承父线程是否守护线程,优先级,父线程上下文类加载器
 * 设置父线程的ThreadLocal的数据

clone

  • 覆写
  • 抛出不支持克隆的异常,因为线程无法正在意义上的克隆,创建一个新的线程吧.

start

  • 调用了start0
  • 设置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

  • 线程死亡(stop)的时候会返回null

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一起来判断,否则可能会判断错误
  • 里面有很多调试的方法,正常情况下不建议使用
  • 已经弃用的方法不要使用
    未完待续
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值