你项目中的多线程是用什么创建的?

1 个回答

  • 韩湘子
    为了击碎你伪装的表面,我只能用尽全身力气挥出那惊鸿的半月弧光。
    ## 1. 直接创建(少用) ```java new Thread(() -> { // 任务逻辑 }).start(); ``` * **优点**:简单直接 * **缺点**:不可复用线程,频繁创建/销毁有性能开销,没法统一管理 > 这种方式我只会在临时测试、小工具里用,生产基本不用。 ## 2. 实现 Runnable / Callable + Thread(偶尔用) ```java Callable<String> task = () -> { return "result"; }; FutureTask<String> future = new FutureTask<>(task); new Thread(future).start(); ``` * **Callable** 可以有返回值、能抛异常 * **Runnable** 没返回值 * 控制力比直接 `new Thread` 多一点,但依然是**裸线程**,不适合大规模并发 ## 3. 线程池(生产首选) 生产项目里我基本都用 **`ExecutorService` / `ThreadPoolExecutor`** 或 Spring 封装的 `@Async`,好处是: * **线程可复用**,避免频繁创建/销毁 * **有队列**,能缓冲任务 * **有拒绝策略**,防止任务爆仓 * **方便监控线程池状态** 示例: ```java ExecutorService pool = new ThreadPoolExecutor( 4, // 核心线程数 8, // 最大线程数 60, TimeUnit.SECONDS, // 空闲线程存活时间 new LinkedBlockingQueue<>(1000), // 队列容量 Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() // 拒绝策略 ); pool.execute(() -> { // 任务逻辑 }); ``` 在 Spring Boot 项目里: ```java @EnableAsync @Service public class MyService { @Async("customExecutor") public void doWork() { ... } } ``` 配合 `ThreadPoolTaskExecutor` 做参数化配置。 ## 4. 特殊场景 * **定时任务** → `ScheduledExecutorService` / `@Scheduled` * **并行流** → `parallelStream()`(底层用 ForkJoinPool) * **异步计算** → `CompletableFuture` **总结**: 我自己项目里,**普通业务异步**几乎都是用 **线程池**,结合 Spring 的 `@Async` 或直接 `ThreadPoolExecutor`; **并行计算型**会用 `ForkJoinPool` 或 `CompletableFuture`; **定时**任务走 `ScheduledExecutorService`。
    发布于 2025-08-13 10:53 •IP属地 吉林
    举报
    评论
    收藏