1、典型回答
start() 方法是用来启动一个新线程的,而 run() 方法是一个普通方法,并不会重启线程,run() 方法中存放的是当前线程要执行的任务代码。
它们的区别主要有以下几点:
- 方法性质不同:run() 是一个普通方法,而 start() 是开启新线程的方法
- 执行流程不同:调用run()方法会立即执行任务,而调用 start() 方法是将当前线程的状态,从新建状态改为就绪状态。此时它会等待操作系统调度器为其分配 CPU 时间片,一旦获得时间片,线程开始执行其 run() 方法中的代码了
- 多次调用次数不同:run() 方法可以被重复多次调用,而 start() 方法只能被调用一次,如果被多次调用会抛出IllegalThreadStateException 异常
- 并发执行不同:调用 start()方法会重启新线程,并发运行,而调用run() 方法是在当前的主线程中执行,它依然是单线程执行的。
2、知识扩展
为什么 start() 方法不能被重复调用?
这个问题的浅层次原因是JVM 不允许,当多次调用 start() 方法的时候程序会提示 IllealThreadStateException 的异常,但为什么JVM 会提示这个异常?
更深层次的原因是,线程生命周期管理的需要,因为在调用 start() 方法时,此线程的状态会从新建状态(NEW)变为就绪状态(RUNNABLE),JVM 会会为此线程分配必要的系统资源,如内存、程序计数器、线程栈等,此时如果允许多次调用 start() 方法的话,将会导致线程生命周期的混乱,也会让线程进入无效或未知的状态,同时也会导致系统资源的泄漏或者不可预测的行为,所以JVM 是不允许多次调用 start() 方法的。
线程生命周期请参考:说一下线程的生命周期?-CSDN博客