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()--获得线程的堆栈信息

其中还有些内容没有贴出来,感觉一般面试也不会问到,同时正常情况下也不用关心的内容。

最新文章

  1. Java编程里的类和对象
  2. shape 代码生成器
  3. CSS裁剪clip
  4. SPOJ:ABCDEF
  5. ios 宏定义 系统版本 判定
  6. Spring中IoC的入门实例
  7. ORM之Dapper操作Sql Server和MySql数据库
  8. C# 使用 AutoResetEvent 或 ManualResetEvent 同步两个线程
  9. Swift学习笔记八
  10. EditPlus64的安装配置
  11. MyGeneration 数据库驱动为空
  12. HTML注释简介
  13. Javaweb学习(一):tomcat服务器配置与启动
  14. VMware下安装centos7及网络配置
  15. Python多继承之MRO算法
  16. Unity之fragment shader中如何获得视口空间中的坐标
  17. 2、zabbix工作原理及安装配置
  18. 深究CSS中Position的属性和特性
  19. shell 网络状态查询 ping curl telnet
  20. MySQL 事务 是对数据进行操作,对结构没有影响,比如创建表、删除表,事务就不起作用

热门文章

  1. JavaScript之String总汇
  2. Linux下的SVN服务器搭建(转)
  3. Idea无法运行Maven项目
  4. MySQL锁详解!(转载)
  5. 关于latex编译中文不显示问题的解决方法。
  6. iframe 页面刷新
  7. Node操作MongoDB并与express结合实现图书管理系统
  8. 洛谷P4054 [JSOI2009]计数问题(二维树状数组)
  9. Android--activity切换时的动画
  10. 使用Webpack对Css文件压缩处理的思考