Java并发04:线程的创建与启动 - 4种方式深度对比
引言:一道高频面试题 面试官:请说一下Java中创建线程有哪几种方式? 候选人A:继承Thread类、实现Runnable接口…还有吗? 面试官:还有吗?Callable算吗?线程池算吗?它们有什么区别? 大部分候选人能说出前两种,但很少有人能说清楚: 为什么推荐实现Runnable而不是继承Thread? Callable和Runnable的本质区别是什么? 线程池是怎么创建线程的? start()和run()到底有什么区别? 今天我们从第一性原理出发,彻底搞懂这些问题。 一、方式1:继承Thread类 1.1 基本用法 public class MyThread extends Thread { @Override public void run() { System.out.println("线程执行: " + Thread.currentThread().getName()); } public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); // 启动线程 } } 输出: 线程执行: Thread-0 1.2 原理分析 // Thread类的核心结构 public class Thread implements Runnable { private Runnable target; // 任务对象 public Thread() { // 空构造 } public Thread(Runnable target) { this.target = target; // 传入任务 } @Override public void run() { if (target != null) { target.run(); // 执行任务 } // 子类可以重写这个方法 } public synchronized void start() { // 1. 检查状态 if (threadStatus != 0) throw new IllegalThreadStateException(); // 2. 加入线程组 group.add(this); // 3. 调用native方法启动线程 boolean started = false; try { start0(); // ← native方法,创建操作系统线程 started = true; } finally { // ... } } private native void start0(); // JNI调用,创建OS线程 } 关键点: ...