在 Java 中,ExecutorService 是 Java 并发包(java.util.concurrent)提供的一个线程池接口,用来提交和管理任务。下面从基础到常见用法给你讲清楚。
常见几种方式:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// 固定线程数
ExecutorService executor = Executors.newFixedThreadPool(4);
// 单线程
ExecutorService single = Executors.newSingleThreadExecutor();
// 缓存线程池(按需创建)
ExecutorService cached = Executors.newCachedThreadPool();
⚠️ 实际项目中更推荐用
ThreadPoolExecutor手动构造,方便控制参数。
Runnable(无返回值)executor.submit(() -> {
System.out.println("任务执行中");
});
或:
Runnable task = () -> System.out.println("Hello");
executor.submit(task);
Callable(有返回值)import java.util.concurrent.Callable;
import java.util.concurrent.Future;
Callable<Integer> task = () -> {
return 1 + 2;
};
Future<Integer> future = executor.submit(task);
获取结果:
Integer result = future.get(); // 会阻塞
System.out.println(result);
List<Callable<String>> tasks = new ArrayList<>();
tasks.add(() -> "A");
tasks.add(() -> "B");
List<Future<String>> futures = executor.invokeAll(tasks);
或只取第一个完成的:
String result = executor.invokeAny(tasks);
非常重要,不然程序不会退出
executor.shutdown(); // 不再接受新任务
如果需要等待任务完成:
executor.shutdown();
executor.awaitTermination(10, TimeUnit.SECONDS);
强制关闭:
executor.shutdownNow();
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(() -> {
System.out.println("任务1");
});
Future<Integer> future = executor.submit(() -> 10 + 20);
System.out.println(future.get());
executor.shutdown();
✅ submit 不会抛异常,异常在 Future.get() 中
✅ execute 只能跑 Runnable,不返回 Future
✅ 线程池必须关闭
✅ 不要手动 new Thread() 代替线程池
如果你愿意,我也可以帮你:
submit vs execute你现在是准备面试,还是项目里在用?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。