此笔记使用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方法才能启动线程