文章目录
启动线程方式的示例
- 启动线程方式的示例
- start方法解读
- 为什么 run()方法不是启动线程的方式
如下的代码示例. 使用lambda表达式 方式, 实现了Runnable 接口. 分别用 run方法和start方法去启动线程
public class StartAndRunMethod {
public static void main(String[] args) {
Runnable runnable = () -> {
System.out.println(Thread.currentThread().getName());
};
runnable.run();
new Thread(runnable).start();
}
}
运行程序, 可以看到 run方法打印的线程名称为main线程, 并没有起一个新的线程. 而start方法才是启动了一个新的线程.
start方法的含义:
- 通知jvm在有空闲的情况下, 启动新的线程 . 至于什么时候去运行这个线程,是由线程的调度器去决定的 . 因此调用start方法的顺序, 并不能决定执行顺序.
- 由main线程去做一些准备工作,让新创建的线程能够去运行 让线程处于就绪状态.
- 不能重复执行start方法 两次执行start方法, 报错如下 .
java.lang.IllegalThreadStateException
非法的线程状态异常. 线程执行完毕, 变成终止状态, 不可能再次变成就绪状态, 因此抛出异常.
start方法源码分析. start方法的源码, 会有如下的几个步骤:
- 启动柜新线程, 检查线程状态
- 加入线程组
- 调用start0() 具体的源码如下.
启动可以看到 start0方法为native方法
Thread 类的run方法如下. 此run有两种情况
- 如果是实现Runnable接口的方式创建线程, 那么此处的run方法就会传入target
- 如果是继承Thread类的方式创建线程, 那么此run方法会完全被重写.
通过源码可以看出, 此方法完全没有创建线程的代码. 只是一个普通的方法而已. 不会像start方法, 去调用native方法, 去启动线程.