线程基础概念
线程是轻量级进程,共享同一进程资源,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编译验证。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/20584.html