Java多线程:2.多线程的启动

100 阅读1分钟

一、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()中的内容。
2. Thread的run()方法源码

在这里插入图片描述