一、start()和run()的比较
start()方法才是启动线程的正确姿势!
/**
* 启动线程的方式:run()和start()
*/
public class StartThreadTest {
public static void main(String[] args) {
StartRunnable runnable = new StartRunnable();
// 使用run()方法启动
runnable.run();
// 使用start()方法启动
new Thread(runnable).start();
}
}
class StartRunnable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
发现使用run()方法启动时主线程执行的,使用start()方法才是启动子线程执行。
二、start()方法
1. 概述
- 启动新线程:
即主线程执行thread.start()方法后,主线程通知JVM,在有空闲的情况下,启动、运行这个新线程。具体什么时间运行,需要由线程调度器决定。 - 准备工作:
在通知JVM来执行新线程前,需要做一些准备工作:使新线程的状态处于就绪状态,指的是新线程已经获取到了除了CPU以外的其他资源(上下文、栈、寄存器等)。 - 线程执行:
当JVM来执行这个线程时,即获取到了CPU,去执行run()方法中的代码。 - 不能重复start():
重复start()会抛出异常,具体实现见下面源码
2. Thread的start()方法源码
- 检查新线程的状态
初始状态为0 - 加入线程组
- 执行start0()方法
start0()是一个native方法,即用C、C++编写的方法。
三、run()方法
1. 概述
- run()方法就是一个简单的普通的方法,所以调用会直接主线程执行run()中的内容。