JAVA源码笔记(jdk 1.7.0_75)--Thread-精简版本
来源:互联网 发布:人工智能的原理是什么? 编辑:程序博客网 时间:2024/05/20 22:35
核心静态方法
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
- JAVA源码笔记(jdk 1.7.0_75)--Thread-精简版本
- JAVA源码笔记(jdk 1.7.0_75)--Thread-详细版本
- Linux获取jdk版本中的“1.7.0_75”字符串
- jdk源码学习笔记---Thread
- package jdk-2000:1.7.0_75-fcs.x86_64 is already installed
- java JDK各版本源码下载地址
- jdk/java版本与Android源码编译中的错误
- 为ant指定编译java源码的jdk版本
- 为ant指定编译java源码的jdk版本
- 精简 jdk
- JDK版本问题Exception in thread "main" java.lang.UnsupportedClassVersionError: Hello
- JDK版本问题Exception in thread "main" java.lang.UnsupportedClassVe
- Java Thread源码分析
- java Thread 源码分析
- java Thread源码分析
- Java Thread 源码 附录
- java thread源码分析
- 《JAVA源码分析》:Thread
- 我的Android进阶之旅------>解决:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
- 使用快启动一键重装系统详细图文教程
- pcl显示报错-VTK
- pat 1106. Lowest Price in Supply Chain (25)
- android 没有焦点可尝试
- JAVA源码笔记(jdk 1.7.0_75)--Thread-精简版本
- MAC OS下使用OpenSSL生成私钥和公钥的方法
- Xcode8修改scheme名称
- Spring 提示:无法找到元素 'aop:aspectj-autoproxy'
- Struts2中valuestack
- 百度地图-基本环境搭建
- android跨应用aidl通讯
- Bootstrap Switch(开关控件)
- js 冒泡排序法