zoukankan      html  css  js  c++  java
  • 线程相关代码分析->常见面试题(一、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的枚举来代表线程的状态:NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED ,后续会详细解析状态的含义来出现的场景。

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

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

  • 相关阅读:
    [转]使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger
    [转]ASP.NET Core配置环境变量和启动设置
    [转]ASP.NET Core 指定环境发布(hosting environment)
    [转]COPY OR MOVE FILES AND FOLDERS USING OLE AUTOMATION
    [转]How to Use xp_dirtree to List All Files in a Folder
    [转]How to nest transactions nicely
    [转]Using TRY...CATCH in Transact-SQL
    [转][C#] 对List<T>取交集、连集及差集
    [转]Pass a ViewBag instance to a HiddenFor field in Razor
    Apache Ignite简介以及Ignite和Coherence、Gemfire、Redis等的比较
  • 原文地址:https://www.cnblogs.com/congsg2016/p/5613174.html
Copyright © 2011-2022 走看看