Java 多线程框架开发教程

一、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()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值