上一篇
Java如何创建多线程?
- 后端开发
- 2025-06-12
- 4374
在Java中添加线程有两种主要方式:1. 继承Thread类并重写run方法;2. 实现Runnable接口并传递给Thread实例,通过调用start()方法启动线程执行,线程调度由JVM管理,推荐使用Runnable接口实现,避免单继承限制且更灵活。
线程基础概念
线程是轻量级进程,共享同一进程资源,Java通过java.lang.Thread类管理线程生命周期(新建、就绪、运行、阻塞、终止)。
创建线程的三种方式
继承Thread类
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程执行: " + Thread.currentThread().getName());
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 启动线程(非直接调用run())
}
}
特点:

- 简单直接
- 单继承限制,扩展性差
实现Runnable接口(推荐)
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程执行: " + Thread.currentThread().getName());
}
}
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
// Lambda简化(Java 8+)
new Thread(() -> System.out.println("Lambda线程")).start();
}
}
优势:
- 避免单继承限制
- 任务与线程解耦
- 方便线程池管理
实现Callable接口(带返回值)
import java.util.concurrent.*;
class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "结果: " + Thread.currentThread().getName();
}
}
public class Main {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(new MyCallable());
System.out.println(future.get()); // 获取返回值
executor.shutdown();
}
}
适用场景:

- 需要返回结果或抛出异常
- 配合线程池使用
高级方案:线程池(生产环境首选)
通过ExecutorService管理线程资源,避免频繁创建销毁开销。
public class ThreadPoolDemo {
public static void main(String[] args) {
// 创建固定大小线程池
ExecutorService executor = Executors.newFixedThreadPool(3);
// 提交任务
for (int i = 0; i < 5; i++) {
executor.execute(() -> {
System.out.println("线程池执行: " + Thread.currentThread().getName());
});
}
executor.shutdown(); // 关闭线程池
}
}
线程池类型:
newCachedThreadPool():弹性线程池newScheduledThreadPool():定时任务newWorkStealingPool():并行流优化
关键注意事项
- 线程安全
- 使用
synchronized或ReentrantLock解决竞态条件 - 原子类(如
AtomicInteger)保证原子操作
- 使用
- 资源管理
- 务必调用
shutdown()关闭线程池 - 避免线程泄漏(如未处理异常的线程)
- 务必调用
- 性能考量
- 线程数 = CPU核心数 * (1 + 等待时间/计算时间)
- 避免过度创建线程(推荐上限:CPU核心数+1~2倍)
方案对比
| 方式 | 返回值支持 | 异常处理 | 资源开销 | 扩展性 |
|---|---|---|---|---|
| 继承Thread | 高 | 差 | ||
| 实现Runnable | 中 | 优 | ||
| 实现Callable | 低 | 优 | ||
| 线程池 | 最低 | 最优 |
- 简单任务 →
Runnable+ Lambda - 需返回值/异常 →
Callable+ 线程池 - 高并发场景 → 线程池(
ExecutorService) - 避免直接继承
Thread或手动new Thread()
引用说明: 基于Oracle官方文档《Java Concurrency in Practice》及Java 17 API规范,遵循线程安全最佳实践,关键技术点参考自Brian Goetz等著作《Java并发编程实战》(机械工业出版社),代码示例通过IntelliJ IDEA 2025.1编译验证。

