线程相关代码分析->常见面试题(一、Thead类)
As always,我们直接看jdk的代码切入:
首先是最简单的Runnable接口:
public interface Runnable {
public abstract void run();
}
我们可以看到Runnable其实特别简单,就是接口,里面只有一个方法(其实public abstract根本没必要,不过是不是老版本jdk需要添加倒是还不清楚)。
我们主要需要分析的对象是Thread类:
publicclass Thread implements Runnable { ---thread类实现了Runnable接口,也就是需要覆盖run方法
private static native void registerNatives();
static {
registerNatives(); ---注册类中的本地方法--必须在所有本地方法初始化之前调用;
}
private char name[];---线程的名字
private int priority;---线程的优先级,线程优先级在Thread类中有常量定义,1-10之间的数字,如果出现定义的优先级超过这个区间会报出IllegalArgumentException()
public final static int MIN_PRIORITY = 1;---线程的最小优先级
public final static int NORM_PRIORITY = 5;---线程的默认优先级
public final static int MAX_PRIORITY = 10;---线程的最大优先级
private Thread threadQ;-----此处删除部分定义但是无用的代码(ps:看来jdk的代码也有这么多所谓的“预留”字段,后来估计就不了了之了)。
private boolean daemon = false;--是否后台线程,也就是守护线程,如果有用户线程(也就是非后台线程)后台线程将持续存在,直到没有用户线程后自动终止。
需要注意,如果要setDaemon(true)的话一定要在thread.start()之前进行,
无法对于一个start之后的线程进行设置。同时,因为后台线程在用户线程没有了之后会自动结束,所以尽量不要操作一些系统资源。
private Runnable target; ---要调用run方法的runnable对象,其实也就是当前线程了 private ThreadGroup group;---对线程进行分组管理的对象,初始化线程的时候可以指定;
注意线程组可以包含线程组,也就是说,是一个树形的线程结构,可以对于整个组的线程进行优先级设置、守护非守护设置等等。
private ClassLoader contextClassLoader;---类加载器,可以自定义
private static int threadInitNumber;---匿名线程的自增的线程号
private static synchronized int nextThreadNum() {
return threadInitNumber++;
}
ThreadLocal.ThreadLocalMap threadLocals = null;---threallocalmap 这个暂且不解释,后续会有专门的说明,线程私有的theadLocal<T>的分析
private long tid;---当前线程的Id private static long threadSeqNumber;--线程自动Id private static synchronized long nextThreadID() {--线程自增Id
return ++threadSeqNumber;
}
private volatile int threadStatus = 0;--线程状态 VM.class中的定义:
public static State toThreadState(int var0) {
return (var0 & 4) != 0?State.RUNNABLE:((var0 & 1024) != 0?State.BLOCKED:((var0 & 16) != 0?State.WAITING:((var0 & 32) != 0?State.TIMED_WAITING:((var0 & 2) != 0?State.TERMINATED:((var0 & 1) == 0?State.NEW:State.RUNNABLE)))));
}
目前有个专门的state的枚举来代表线程的状态:NEW\RUNNABLE\BLOCKED\WAITING\TIMED_WAITING\TERMINATED\ ,后续会详细解析状态的含义来出现的场景。
volatile Object parkBlocker;---用于记录当前线程被谁阻塞
private volatile Interruptible blocker;
private final Object blockerLock = new Object();
public static native Thread currentThread();---返回当前执行线程的一个引用
public static native void yield();---表示当前线程愿意交出cpu时间供其他线程使用,但是实际上是否交的出去并不一定。这个方法其实实际场景很少用到,但是很多面试会问到。。
public static native void sleep(long millis) throws InterruptedException;--睡眠等待,不释放同步锁(和wait的区别是经常问到的问题,wait释放锁,并且wait是Object的方法)
---接下来是一堆各式各样重载的构造参数和init方法,不再赘述。
public synchronized void start()--启动,判断状态是否是0,否则报错
@Override
public void run() {----重写run
if (target != null) {
target.run();
}
}
private void exit() {----可以让线程在真正结束前有机会被回收
if (group != null) {
group.threadTerminated(this);
group = null;
}
threadLocals = null;
inheritableThreadLocals = null;
inheritedAccessControlContext = null;
blocker = null;
uncaughtExceptionHandler = null;
}
---几个deprecated的stop方法,不赘述
public void interrupt() {
if (this != Thread.currentThread())
checkAccess();
synchronized (blockerLock) {
Interruptible b = blocker;
if (b != null) {
interrupt0(); // Just to set the interrupt flag
b.interrupt(this);
return;
}
}
interrupt0();
}
---接下来还有之前上面描述的属性的get和set方法以及目前被deprecated的suspend和resume方法;
public StackTraceElement[] getStackTrace()--获得线程的堆栈信息
其中还有些内容没有贴出来,感觉一般面试也不会问到,同时正常情况下也不用关心的内容。
线程相关代码分析->常见面试题(一、Thead类)的更多相关文章
- 【转载】常见面试题:C#中String和string的区别分析
在很多人面试C#开发工程师的时候,会遇到一个面试题,就是C#中String和string有啥区别.其实针对这个问题C#中String和string没有本质上的区别,两者在程序中都可使用,稍微的一个区别 ...
- java主线程等待所有子线程执行完毕在执行(常见面试题)
java主线程等待所有子线程执行完毕在执行(常见面试题) java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个 ...
- 整理的最全 python常见面试题(基本必考)
整理的最全 python常见面试题(基本必考) python 2018-05-17 作者 大蛇王 1.大数据的文件读取 ① 利用生成器generator ②迭代器进行迭代遍历:for line in ...
- python爬虫常见面试题(二)
前言 之所以在这里写下python爬虫常见面试题及解答,一是用作笔记,方便日后回忆:二是给自己一个和大家交流的机会,互相学习.进步,希望不正之处大家能给予指正:三是我也是互联网寒潮下岗的那批人之一,为 ...
- 整理的最全 python常见面试题
整理的最全 python常见面试题(基本必考)① ②③④⑤⑥⑦⑧⑨⑩ 1.大数据的文件读取: ① 利用生成器generator: ②迭代器进行迭代遍历:for line in file; 2.迭代 ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...
- java常见面试题及答案
java常见面试题及答案 来源 https://blog.csdn.net/hsk256/article/details/49052293 来源 https://blog.csdn.net/hsk25 ...
- Java 常见面试题(一)
1)什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件.Java被设 ...
- 【转载】JAVA常见面试题及解答(精华)
JAVA常见面试题及解答(精华) 1)transient和volatile是java关键字吗?(瞬联) 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: ...
随机推荐
- 表格行与列mouse经过时高亮显示
Insus.NET有在asp.net mvc应用程序,练习jQuery与css时,实现了<表格行mouse经过时高亮显示>http://www.cnblogs.com/insus/p/37 ...
- php一些单选、复选框的默认选择方法(示例)
转载 http://www.php.cn/php-weizijiaocheng-360029.html 一. radio和checkbox及php select默认选择的实现代码 1.radio单选框 ...
- Java虚拟机--Java内存区域的划分和异常
Java内存区域的划分和异常 运行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域. 程序计数器 线程私有.可看作是当前线程所执行的字节码的行号指示器,字节码解释器的工作是通 ...
- 【Java深入研究】3、HashMap源码解析(jdk 1.7)
1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...
- centos下MySQL Workbench连接时崩溃的解决方法
在centos6.5中使用MySQL Workbench 6.3.8链接数据库崩溃,如果是在终端使用命令“mysql-workbench”打开的话会有如下错误提示: /usr/libexec/mysq ...
- python匿名函数lambda与switch的实现
1,lambda的语法跟es6的箭头函数差不多 >>> show=lambda x,y: x * y >>> show( 10, 20 ) 200 2,递归求阶乘 ...
- 一道很好的mysql面试练习题,having综合应用
写一条SQL语句,求出2门以及2门以上不及格的科目平均分 >要出现2门以及2门以上的学科不及格 >计算该考生所有学科的平均分,不单是,不及格的那几门 #创建表: create table ...
- mysql-学习笔记1
1.while循环的一个方便的用法是循环处理一个SQL查询结果中的数据行. 2.mysqli_fetch_array(),这个内置的PHP函数从一个数据库查询的结果中获取一个数据行,可以搭配while ...
- web界面 之 登录 (初稿)
web登录一般注意以下几点: 1)拥有元素:用户名,密码(密码字符显示与隐藏功能),登录按钮,忘记密码链接(忘记用户名链接),注册链接 2)用户体验: •页面显示,光标默认停在第一个输入框 利用htm ...
- MVC与单元测试实践之健身网站(一)-项目概述
前不久刚刚通过租房网站的开发学习了MVC,并随后学习了单元测试相关的基础,现在开始健身网站的开发,该项目将结合MVC与单元测试,在开发实践过程中,趁热打铁,巩固并运用之前的内容. 一 健身网站功能描述 ...