zoukankan      html  css  js  c++  java
  • Thread 源码阅读

    Thread

    • 属性说明
    /**
     *  程序中的执行线程
     * @since   1.0
     */
    public
    class Thread implements Runnable {
        /* Make sure registerNatives is the first thing <clinit> does. */
        private static native void registerNatives();
        static {
            registerNatives();
        }
    
        /**
         *  线程名称
         */
        private volatile String name;
        
        /**
         *  线程优先级 
         */
        private int            priority;
        
        /**
         *  此线程是否是守护线程  
         */
        private boolean     daemon = false;
    
        /**
         *  将运行的目标
         */
        private Runnable target;
    
        /**
         *  此线程所在的线程组
         */
        private ThreadGroup group;
    
        /**
         *  当前线程的上下文类加载器
         */
        private ClassLoader contextClassLoader;
    
        /**
         *  此线程继承的访问控制上下文
         */
        private AccessControlContext inheritedAccessControlContext;
    
        /**
         * 匿名线程的自增编号
         */
        private static int threadInitNumber;
    
        /** 与当前线程绑定的  ThreadLocalMap */
        ThreadLocal.ThreadLocalMap threadLocals = null;
    
        /**
         *  继承的 ThreadLocalMap
         */
        ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
    
        /**
         *  此线程请求的堆栈大小,如果未设置则由 JVM 自己决定
         */
        private long stackSize;
    
        /**
         *  此线程的 ID
         */
        private long tid;
    
        /**
         *  线程名称序列 ID
         */
        private static long threadSeqNumber;
    
        /**
         *  此线程的状态
         */
        private volatile int threadStatus;
    
        /**
         *  当前线程在此目标对象 parkBlocker 上阻塞
         * java.util.concurrent.locks.LockSupport.park.
         */
        volatile Object parkBlocker;
    
        /**
         *  阻塞此线程的可中断 IO 对象
         */
        private volatile Interruptible blocker;
        
        /**
         *  阻塞锁
         */
        private final Object blockerLock = new Object();
    
        /**
         *  线程的最小优先级
         */
        public static final int MIN_PRIORITY = 1;
    
        /**
         *  线程的默认优先级
         */
        public static final int NORM_PRIORITY = 5;
    
        /**
         *  线程的最大优先级
         */
        public static final int MAX_PRIORITY = 10;
    
    • 常用静态方法
        /**
         *  当前线程所在线程组中估计的活跃线程数
         */
        public static int activeCount() {
            return currentThread().getThreadGroup().activeCount();
        }
    
        /**
         *  返回当前执行线程
         */
        @HotSpotIntrinsicCandidate
        public static native Thread currentThread();
    
        /**
         *  打印当前线程的堆栈信息,只用于调试
         */
        public static void dumpStack() {
            new Exception("Stack trace").printStackTrace();
        }
    
        /**
         *  当前线程是否持有目标对象的监视器
         * @since 1.4
         */
        public static native boolean holdsLock(Object obj);
    
        /**
         *  返回并清空当前线程的中断状态
         *
         * @revised 6.0
         */
        public static boolean interrupted() {
            return currentThread().isInterrupted(true);
        }
    
        /**
         *  让当前线程自旋等待一会
         * @since 9
         */
        @HotSpotIntrinsicCandidate
        public static void onSpinWait() {}
    
        /**
         *  当前线程休眠指定的毫秒数
         *
         * @param  millis   休眠的毫秒数
         */
        public static native void sleep(long millis) throws InterruptedException;
    
        /**
         *  当前线程愿意让步处理器时间,从运行状态进入就绪状态
         */
        public static native void yield();
    
    • 实例化
        /**
         *  创建运行目标任务 target 的新线程
         *
         * @param  target   目标 Runnable 任务
         */
        public Thread(Runnable target) {
            init(null, target, "Thread-" + nextThreadNum(), 0);
        }
    
        /**
         *  创建运行目标任务 target 的新线程,并指定线程名称,方便排查问题
         *
         * @param  target   目标 Runable 任务
         * @param  name     新线程的名称
         */
        public Thread(Runnable target, String name) {
            init(null, target, name, 0);
        }
    
    • 常用方法
        /**
         *  此线程是否还存活
         */
        public final native boolean isAlive();
    
        /**
         *  此线程是否是守护线程
         */
        public final boolean isDaemon() {
            return daemon;
        }
    
        /**
         *  此线程是否已经被设置中断标识,同时清除其中断标识。
         *
         * @revised 6.0
         */
        public boolean isInterrupted() {
            return isInterrupted(false);
        }
    
        /**
         *  返回线程创建时自动生成的ID
         */
        public long getId() {
            return tid;
        }
    
        /**
         *  读取此线程的名称
         */
        public final String getName() {
            return name;
        }
    
        /**
         *  读取此线程的优先级
         */
        public final int getPriority() {
            return priority;
        }
    
        /**
         *  返回此线程的状态
         * @since 1.5
         */
        public State getState() {
            // get current thread state
            return jdk.internal.misc.VM.toThreadState(threadStatus);
        }
    
        /**
         *  线程状态
         */
        public enum State {
            /**
             *  线程刚创建,还未启动
             */
            NEW,
    
            /**
             *  线程正在运行
             */
            RUNNABLE,
    
            /**
             *  此线程在等待获取指定对象的监视器,已经阻塞
             */
            BLOCKED,
    
            /**
             *  此线程在阻塞等待其他线程的信号
             */
            WAITING,
    
            /**
             *  此线程在超时阻塞等待
             */
            TIMED_WAITING,
    
            /**
             *  此线程已经终止
             */
            TERMINATED;
        }
    
        /**
         *  读取此线程的调用堆栈
         * @since 1.5
         */
        public StackTraceElement[] getStackTrace() {
            if (this != Thread.currentThread()) {
                // check for getStackTrace permission
                final SecurityManager security = System.getSecurityManager();
                if (security != null) {
                    security.checkPermission(
                            SecurityConstants.GET_STACK_TRACE_PERMISSION);
                }
                // 线程已经死亡,则返回空的调用堆栈
                if (!isAlive()) {
                    return EMPTY_STACK_TRACE;
                }
                final StackTraceElement[][] stackTraceArray = dumpThreads(new Thread[] {this});
                StackTraceElement[] stackTrace = stackTraceArray[0];
                // a thread that was alive during the previous isAlive call may have
                // since terminated, therefore not having a stacktrace.
                if (stackTrace == null) {
                    stackTrace = EMPTY_STACK_TRACE;
                }
                return stackTrace;
            } else {
                return new Exception().getStackTrace();
            }
        }
    
        /**
         *  启动当前线程
         */
        public synchronized void start() {
            /**
             *  线程不是新建状态
             */
            if (threadStatus != 0) {
                throw new IllegalThreadStateException();
            }
    
            // 将此线程加入线程组
            group.add(this);
    
            boolean started = false;
            try {
                // 启动线程
                start0();
                started = true;
            } finally {
                try {
                    // 如果启动失败,则将其从线程组中移除
                    if (!started) {
                        group.threadStartFailed(this);
                    }
                } catch (final Throwable ignore) {
                }
            }
        }
    
        private native void start0();
    
        /**
         *  中断当前线程
         */
        public void interrupt() {
            if (this != Thread.currentThread()) {
                checkAccess();
            }
    
            synchronized (blockerLock) {
                final Interruptible b = blocker;
                if (b != null) {
                    interrupt0();           // Just to set the interrupt flag
                    b.interrupt(this);
                    return;
                }
            }
            // 中断此线程
            interrupt0();
        }
    
        /**
         *  阻塞等待当前线程执行完毕
         */
        public final void join() throws InterruptedException {
            join(0);
        }
    
        /**
         *  在指定的毫秒内阻塞等待此线程执行完毕
         *
         * @param  millis   阻塞等待的毫秒数
         */
        public final synchronized void join(long millis)
                throws InterruptedException {
            // 当前毫秒数
            final long base = System.currentTimeMillis();
            long now = 0;
            // 毫秒数非法
            if (millis < 0) {
                throw new IllegalArgumentException("timeout value is negative");
            }
            // 毫秒数为 0,则表示无限期阻塞等待此线程执行完毕
            if (millis == 0) {
                while (isAlive()) {
                    wait(0);
                }
            } else {
                // 线程处于存活状态
                while (isAlive()) {
                    // 计算延时
                    final long delay = millis - now;
                    if (delay <= 0) {
                        break;
                    }
                    // 阻塞等待
                    wait(delay);
                    // 重新计算时间
                    now = System.currentTimeMillis() - base;
                }
            }
        }
    
        /**
         *  在当前线程中执行目标任务
         */
        @Override
        public void run() {
            if (target != null) {
                target.run();
            }
        }
    
  • 相关阅读:
    C# 遍历enum类型元素、获取最大值、最小值
    ABAP-成本报表案例
    recovering corrupted postgres database
    自定义QHeaderView后,点击表头排序失效的解决办法
    Visual Studio 2017社区版登录时始终卡在登录界面的另一个登录办法
    已经安装好的TortoiseSVN在更改盘符后不能使用无法卸载也无法安装的解决办法
    使用别人已经静态编译好的Qt库在进行自己的Qt Creator配置时,在配置Qt Version时出现的2个问题解决办法
    ASCII、Unicode和UTF-8,一文看懂,保存链接
    centos7 挂载硬盘操作
    一次性kill所有进程的命令
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10502146.html
Copyright © 2011-2022 走看看