• java源码阅读笔记-Thread


    1 thread状态

    1.1 状态源码

    public enum State {
        /**
         * 新建状态,线程被创建出来,但尚未启动时的线程状态
         */
        NEW,
    
        /**
         * 就绪状态,表示可以运行的线程状态,但它在排队等待来自操作系统的 CPU 资源
         */
        RUNNABLE,
    
        /**
         * 阻塞等待锁的线程状态,表示正在处于阻塞状态的线程
         * 正在等待监视器锁,比如等待执行 synchronized 代码块或者
         * 使用 synchronized 标记的方法
         */
        BLOCKED,
    
        /**
         * 等待状态,一个处于等待状态的线程正在等待另一个线程执行某个特定的动作。
         * 例如,一个线程调用了 Object.wait() 它在等待另一个线程调用
         * Object.notify() 或 Object.notifyAll()
         */
        WAITING,
    
        /**
         * 计时等待状态,和等待状态 (WAITING) 类似,只是多了超时时间,比如
         * 调用了有超时时间设置的方法 Object.wait(long timeout) 和 
         * Thread.join(long timeout) 就会进入此状态
         */
        TIMED_WAITING,
    
        /**
         * 终止状态,表示线程已经执行完成
         */
    }
    

    1.2 thread工作模式

      首先要创建线程并指定线程需要执行的业务方法,然后再调用线程的 start() 方法,此时线程就从 NEW(新建)状态变成了 RUNNABLE(就绪)状态,此时线程会判断要执行的方法中有没有 synchronized 同步代码块,如果有并且其他线程也在使用此锁,那么线程就会变为 BLOCKED(阻塞等待)状态,当其他线程使用完此锁之后,线程会继续执行剩余的方法。
      当遇到 Object.wait() 或 Thread.join() 方法时,线程会变为 WAITING(等待状态)状态,如果是带了超时时间的等待方法,那么线程会进入 TIMED_WAITING(计时等待)状态,当有其他线程执行了 notify() 或 notifyAll() 方法之后,线程被唤醒继续执行剩余的业务方法,直到方法执行完成为止,整个线程的流程就执行完毕。
    

    1.3 BLOCKED 和 WAITING 的区别

      虽然 BLOCKED 和 WAITING 都有等待的含义,但二者有着本质的区别,首先它们状态形成的调用方法不同,其次 BLOCKED 可以理解为当前线程还处于活跃状态,只是在阻塞等待其他线程使用完某个锁资源;而 WAITING 则是因为自身调用了 Object.wait() 或着是 Thread.join() 又或者是 LockSupport.park() 而进入等待状态,只能等待其他线程执行某个特定的动作才能被继续唤醒,比如当线程因为调用了 Object.wait() 而进入 WAITING 状态之后,则需要等待另一个线程执行 Object.notify() 或 Object.notifyAll() 才能被唤醒。
    

    1.4 start() 和 run() 的区别

      从执行的效果来说,start() 方法可以开启多线程,让线程从 NEW 状态转换成 RUNNABLE 状态,而 run() 方法只是一个普通的方法。
    

    1.5 join()

      在一个线程中调用 other.join() ,这时候当前线程会让出执行权给 other 线程,直到 other 线程执行完或者过了超时时间之后再继续执行当前线程。
    
    public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;
        // 超时时间不能小于 0
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }
        // 等于 0 表示无限等待,直到线程执行完为之
        if (millis == 0) {
            // 判断子线程 (其他线程) 为活跃线程,则一直等待
            while (isAlive()) {
                wait(0);
            }
        } else {
            // 循环判断
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }
    
  • 相关阅读:
    MAC SAP for JAVA配置
    工艺路线查询
    工单批量关闭
    BOM批量查询
    SE11/SE16N修改表数据
    PI/PO Token配置
    标准IDOC同步物料
    SAP采购订单入库后不允许修改单价增强
    Sap Hana 关于BP的一些理解
    Sap MM 定义物料号码范围
  • 原文地址:https://www.cnblogs.com/ysit/p/13237463.html
Copyright © 2020-2023  润新知