一、start方法和run方法的比较
/** * 对比start和run两种启动线程的方式 * * @author wjh * @date 2020-03-04 13:09 */ public class StartAndRunMethod { public static void main(String[] args) { Runnable runnable = () -> { System.out.println(Thread.currentThread().getName()); }; // run方法启动线程 runnable.run(); // start方法启动线程 new Thread(runnable).start(); } }
结果:
run方法是main主线程执行
start方法才是新创建一个线程执行
二、start()方法原理解读
1、方法的含义
启动一个新线程
准备工作(就绪状态)
不能重复的调用start方法
2、statr源码解析
- 启动新线程检查线程状态
- 加入到线程组
- 调用start0()方法
public synchronized void start() { //检查线程状态 if (threadStatus != 0) throw new IllegalThreadStateException(); //添加到线程组 group.add(this); boolean started = false; try { //调用start0方法 start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { } } } //该方法是native方法 private native void start0();
三、run方法原理解读
1、源码
@Override public void run() { if (target != null) { target.run(); } }
从源码看,直接调用run方法就是调用一个普通的方法,并没有创建一个新线程