温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何用ExecutorService执行任务

发布时间:2026-10-06 20:10:09 来源:亿速云 阅读:86 作者:小樊 栏目:编程语言

在 Java 中,ExecutorService 是 java.util.concurrent 包提供的线程池框架,用于高效地执行异步任务。下面从基本用法 → 提交任务 → 关闭线程池 → 常见示例逐步说明。


一、创建 ExecutorService

常用工厂方法(来自 Executors):

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// 固定线程数
ExecutorService executor = Executors.newFixedThreadPool(4);

// 单线程
ExecutorService single = Executors.newSingleThreadExecutor();

// 可缓存线程池
ExecutorService cached = Executors.newCachedThreadPool();

⚠️ 生产环境推荐使用 ThreadPoolExecutor 手动构造,避免资源失控。


二、提交任务的方式

1️⃣ 执行无返回值的任务(Runnable)

executor.execute(() -> {
    System.out.println("任务执行中:" + Thread.currentThread().getName());
});

特点:

  • 没有返回值
  • 无法感知任务是否完成

2️⃣ 提交有返回值的任务(Callable)

import java.util.concurrent.Callable;
import java.util.concurrent.Future;

Callable<String> task = () -> {
    Thread.sleep(1000);
    return "任务完成";
};

Future<String> future = executor.submit(task);

获取结果:

try {
    String result = future.get(); // 阻塞等待
    System.out.println(result);
} catch (Exception e) {
    e.printStackTrace();
}

3️⃣ 批量提交任务(invokeAll / invokeAny)

执行多个任务,等全部完成

List<Callable<String>> tasks = List.of(
    () -> "任务1",
    () -> "任务2"
);

List<Future<String>> futures = executor.invokeAll(tasks);

只要有一个完成就返回

String result = executor.invokeAny(tasks);

三、关闭 ExecutorService(非常重要)

正确关闭方式

executor.shutdown(); // 不再接受新任务

等待任务结束:

try {
    if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
        executor.shutdownNow(); // 强制关闭
    }
} catch (InterruptedException e) {
    executor.shutdownNow();
}

四、完整示例

public class ExecutorDemo {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newFixedThreadPool(2);

        Future<Integer> future = executor.submit(() -> {
            Thread.sleep(500);
            return 42;
        });

        System.out.println("结果:" + future.get());

        executor.shutdown();
    }
}

五、常见使用建议

✅ 使用线程池而不是 new Thread()
✅ 控制线程数量,避免 OOM
✅ 一定要 shutdown()
✅ 使用 Future 处理异常和结果


如果你愿意,我可以:

  • 给你 ThreadPoolExecutor 参数详解
  • 演示 异步任务 + 超时控制
  • 结合 Spring @Async 使用

你想深入哪一块?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手