2.开启多线程启动的世界

105 阅读1分钟

此笔记使用wolai进行梳理,欢迎来访,指出问题 www.wolai.com/mucong/8EaQ…

2.1启动线程的正确姿势

start()与run()方法的比较

/**
 * Created by mucong on 2021/1/16 17:01
 * 描述:      对比star与run两种启动线程的方式
 */
public class StartAndRunMethod {

    public static void main(String[] args) {
        Runnable runnable = ()->{
            System.out.println(Thread.currentThread().getName());
        };

        runnable.run();//main   并没有启动线程

        new Thread(runnable).start();//Thread-0    成功启动线程

    }

}

  • 测试结果可以看出—run方法并不能成功启动线程,而start能

2.2 Start方法原理解读

  • 检查线程状态检查线程状态,只有NEW状态下的线程才能继续,否则会抛出IllegalThreadStateException(在运行中或者已结束的线程,都不能再次启动,详见CantStartTwice10类)

  • 加入线程组

  • 调用start0(start0方法是native方法(c或c++实现,不能直接看源码,再openjdk网站看,不是学习重点

start方法是被synchronized修饰的方法,可以保证线程安全;由JVM创建的main方法线程和system组线程,并不会通过start来启动;


2.3 Run方法原理解读

  • 经典三行代码
@Override public void run() { 
  if (target != null) { 
    target.run(); 
    } 
}

2.4 常见面试题


1.一个线程两次调用start方法会发生什么?为什么?

  • 现象:会抛出异常

  • 原因:线程会进行检查

  • 拓展:TODO

1.既然start方法会调用run方法,为什么我们还要调用start方法呢,而不是直接调用run方法呢

  • 直接调用run方法并不能启动线程,只有start方法才能启动线程