• 线程常用方法 run、start


    一、直接使用 run 方法

    @Slf4j
    public class ThreadDemo {
        public static void main(String[] args) {
            Runnable runnable = () -> {
                log.info("t1 do something...");
            };
    
            Thread t1 = new Thread(runnable, "t1");
            log.info("调用 run 方法之前,线程的状态为: {}",t1.getState());
            t1.run();
            log.info("调用 run 方法之后,线程的状态为: {}",t1.getState());
            log.info("main do something...");
        }
    }
    

    测试结果如下:

    从上面的结果可以看出,虽然有两个线程 main、t1,但是实际上程序都是 main 线程去执行的,并且调用 run 方法之前、之后线程的状态都是 NEW

    二、使用 start 方法

    @Slf4j
    public class ThreadDemo {
        public static void main(String[] args) {
            Runnable runnable = () -> {
                log.info("t1 do something...");
            };
    
            Thread t1 = new Thread(runnable, "t1");
            log.info("调用 start 方法之前,线程的状态为: {}",t1.getState());
            t1.start();
            log.info("调用 start 方法之后,线程的状态为: {}",t1.getState());
            log.info("main do something...");
        }
    }

    从结果可以看出,main、t1 在同时工作,线程调用 start 方法之前的状态是 NEW,调用 start 方法之后的状态是 (RUNNABLE)

    还有一点需要注意的是,线程如果进入了 RUNNABLE 状态之后就不能再调用 start 方法了,否则会抛出异常

    @Slf4j
    public class ThreadDemo {
        public static void main(String[] args) {
            Runnable runnable = () -> {
                log.info("t1 do something...");
            };
    
            Thread t1 = new Thread(runnable, "t1");
            log.info("调用 start 方法之前,线程的状态为: {}",t1.getState());
            t1.start();
            log.info("调用 start 方法之后,线程的状态为: {}",t1.getState());
            t1.start();
            log.info("第二次调用 start 方法之后,线程的状态为: {}",t1.getState());
            log.info("main do something...");
        }
    }
    

     

    三、总结

    1、单独调用 run 方法和普通的方法调用没有区别,不会启动新的线程,线程的状态都是处于新建状态(NEW)

    2、调用 start 方法是将新的线程加入到就绪队列中,此时线程的状态为 RUNNABLE,然后等待操作系统的任务调度器分配 CPU 的时间片,当新的线程获取到了 CPU 的时间片之后,新线程就会执行 run 方法中的代码

  • 相关阅读:
    Z-stack之OSAL初始化流程
    回调函数
    VCC,VDD,VEE,VSS,VPP 表示的意义
    ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8,A9,A12,A15到Cortex-A53,A57
    SQL Server 2005 版本的操作系统兼容性详细列表
    Windows Xp Home Edition 安装IIS组件
    MySql 5.7中添加用户,新建数据库,用户授权,删除用户,修改密码
    AtCoder Beginner Contest 077(ABC)
    Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)(A B C D)
    B. Which floor?
  • 原文地址:https://www.cnblogs.com/xiaomaomao/p/15893583.html
Copyright © 2020-2023  润新知