1、启动线程:start和run的区别
启动线程时,要调用start方法。而start方法会去调用run方法,那么为什么不直接调用run方法?
public static void main(String[] args) {
Runnable runnable = () -> {
System.out.println(Thread.currentThread().getName());
};
runnable.run();
new Thread(runnable).start();
}
运行结果:
run方法只是一个普通的方法,执行时是由主线程去调用的,并没用使用子线程,start方法才是真正用子线程调用的。
start方法执行流程:
- 1、检查线程状态,只有new状态下的线程才能继续,否则会抛出异常
- 2、被加入线程组
- 3、调用start0()方法启动线程
那么,一个线程调用两次start会发生什么?
IllegalThreadStateException
在调用start方法时会进行状态检测,包括新建,就绪,阻塞,等待、计时等待、终止,第二次调用start() 方法的时候,已经被start的线程已经不再是(NEW)状态了,所以无论如何是不能再次启动的。
2、终止线程最优雅的方式——interrupt
网上基本上流传着三种终止线程的方式:常规方式:interrupt;有点逼格的方式:volatile;已经淘汰的方式:stop
其中,volatile方式最有迷惑性,在有些情况下会造成bug。
最优雅的方式:interrupt
interrupt方法并不是一种强制性终止线程的方式,它相当于是一个信号,interrupt方法触发之后,子线程是否停止,是子线程说的算。
public class RightWayStopThreadInProd implements Runnable{
@Override
public void run() {
while (true){
System.out.println("子线程执行任务");
try {
throwInMethod