start()方法不直接启动多个任务,而是使线程进入就绪状态由jvm调度执行run();要并发执行多个任务,需创建多个线程对象并各自调用start(),每个线程封装一个独立任务,且start()只能调用一次。

Java 中的 start() 方法本身不直接“启动多个任务”,而是让一个 Thread 实例进入就绪状态,由 JVM 调度执行其 run() 方法。要实现多个独立任务并发执行,本质是创建多个线程并分别调用各自的 start() 方法——每个线程封装一个独立任务逻辑。
明确任务与线程的对应关系
每个任务需绑定到一个线程实例,不能复用同一个线程对象多次调用 start()(会抛 IllegalThreadStateException)。关键点:
- 一个任务 → 一个
Runnable实现类或Thread子类 - 一个线程对象 → 封装一个任务,且只能
start()一次 - 多个任务 → 需要多个线程对象,各自调用
start()
两种主流写法:Runnable + Thread 或继承 Thread
推荐优先使用 Runnable,解耦更清晰、支持多继承语义:
-
基于 Runnable:定义两个不同任务逻辑,分别传给两个
Thread构造器 -
继承 Thread:为每个任务写独立子类,各自重写
run() - 二者都必须对每个线程对象单独调用
start(),不可共用
避免常见误区
这些操作不会启动新线程,仅在当前线程同步执行:
- 直接调用
thread.run()—— 它只是普通方法调用 - 重复调用
thread.start()—— 第二次起抛异常 - 共享同一个
Runnable实例给多个线程但未做线程安全处理 —— 可能引发数据竞争
实际示例(Runnable 方式)
以下代码启动两个独立任务,彼此无依赖、互不阻塞:
Runnable task1 = () -> {
System.out.println("Task 1 starts");
try { Thread.sleep(1000); } catch (InterruptedException e) {}
System.out.println("Task 1 done");
};
Runnable task2 = () -> {
System.out.println("Task 2 starts");
try { Thread.sleep(800); } catch (InterruptedException e) {}
System.out.println("Task 2 done");
};
Thread t1 = new Thread(task1);
Thread t2 = new Thread(task2);
t1.start(); // 启动第一个独立任务
t2.start(); // 启动第二个独立任务Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











