ThreadPoolExecutor
是 java.util.concurrent
包中用于管理线程池的类。submit()
和 execute()
都是 ThreadPoolExecutor
类中用于向线程池提交任务的方法,但它们有一些关键的区别。
submit()
方法
- 返回一个
Future
对象,该对象表示正在执行或已完成的任务的结果。 - 允许检查任务的状态(例如是否已完成或是否已取消)。
- 允许从任务中获取结果或等待结果。
- 可以抛出
RejectedExecutionException
,如果线程池已关闭或无法处理任务。
execute()
方法
- 不返回任何值。
- 不允许检查任务的状态或获取结果。
- 不会抛出异常(如果线程池已关闭或无法处理任务,则任务将被丢弃)。
何时使用 submit()
使用 submit()
方法的常见场景包括:
- 当需要检查任务的状态或获取结果时。
- 当需要处理可能被拒绝的任务时。
- 当需要跟踪任务的进度或取消任务时。
何时使用 execute()
使用 execute()
方法的常见场景包括:
- 当不需要检查任务的状态或获取结果时。
- 当任务不应被拒绝时(例如,当线程池无界时)。
- 当任务不需要进度跟踪或取消时。
示例
以下示例演示了 submit()
和 execute()
方法之间的区别:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ThreadPoolExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
// 使用 submit() 提交一个任务并获取结果
Future<Integer> future = executorService.submit(() -> {
// 任务代码
return 42;
});
// 使用 execute() 提交一个任务,不获取结果
executorService.execute(() -> {
// 任务代码
System.out.println("任务已完成");
});
// 检查任务状态并获取结果
try {
Integer result = future.get();
System.out.println("任务结果:" + result);
} catch (Exception e) {
e.printStackTrace();
}
executorService.shutdown();
}
}
输出:
任务已完成
任务结果:42
结论
submit()
和 execute()
方法都是向 ThreadPoolExecutor
提交任务的有效方法。选择哪种方法取决于应用程序的具体需求。如果需要检查任务的状态或获取结果,则应使用 submit()
方法。如果不需要这些功能,则可以使用 execute()
方法。