一、Java 多线程框架概述
Java 多线程框架是用于简化并发编程、提升系统性能的核心工具集,主要包括传统线程池(ExecutorService)、CompletableFuture 异步编程、Fork/Join 框架、JDK 8 并行流及虚拟线程(Java 21+)等。这些框架解决了传统多线程开发中的线程管理、任务调度、异步处理等痛点,适用于不同场景(如 I/O 密集型、CPU 密集型、批量任务等)。
二、核心框架详解与实战
1. 传统线程池(ExecutorService):基础并发控制
框架说明:
ExecutorService 是 Java 5 引入的线程池框架,通过复用线程减少创建/销毁开销,支持任务队列、线程管理(如核心线程数、最大线程数、拒绝策略)。适用于批量任务处理(如文件生成、数据同步)。
核心参数配置(最佳实践):
ExecutorService executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // 核心线程数(建议等于 CPU 核心数)
Runtime.getRuntime().availableProcessors() * 2, // 最大线程数(I/O 密集型可适当增大)
60L, TimeUnit.SECONDS, // 空闲线程存活时间
new LinkedBlockingQueue<>(1000), // 任务队列(容量根据任务量调整)
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略(任务过多时,由调用线程执行)
);
实战案例:批量生成文件对象(模拟 30000 个文件,每个文件 sleep 1ms 模拟业务逻辑)
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ThreadPoolDemo {
private static List<FileInfo> fileList = new ArrayList<>();
static class FileInfo {
private String fileName;
private String fileType;
// 省略构造器与 getter/setter
}
static class FileRunnable implements Runnable {
private FileInfo fileInfo;
public FileRunnable(FileInfo fileInfo) {
this.fileInfo = fileInfo;
}
@Override
public void run() {
try {
// 模拟读取文件内容的耗时操作
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
// 初始化 30000 个文件对象
for (int i = 0; i < 30000; i++) {
fileList.add(new FileInfo("file_" + i + ".txt", "text/plain"));
}
// 创建线程池(核心线程数 8,最大线程数 16)
ExecutorService executor = Executors.newFixedThreadPool(8);
// 记录开始时间
long startTime = System.currentTimeMillis();
// 提交任务到线程池
for (FileInfo fileInfo : fileList) {
executor.submit(new FileRunnable(fileInfo));
}
// 关闭线程池(等待所有任务完成)
executor.shutdown();
executor.awaitTermination(1, TimeUnit.HOURS);
// 记录结束时间
long endTime = System.currentTimeMillis();
// 输出耗时
System.out.println("线程池耗时:" + (endTime - startTime) + "ms");
}
}
结果分析:
-
单线程耗时约 30000ms(30 秒);
-
线程池(8 核心)耗时约 4000ms(4 秒),性能提升约 7.5 倍。
注意事项:
-
避免使用
Executors.newFixedThreadPool()等

最低0.47元/天 解锁文章
4384

被折叠的 条评论
为什么被折叠?



