`ExecutorService`的`submit()`方法和`execute()`方法有什么区别?
时间: 2023-11-20 08:57:47 浏览: 35
`ExecutorService`是Java中用于管理线程池的接口,其中`submit()`方法和`execute()`方法都可以用于向线程池提交任务,但是它们有以下区别:
1.返回值不同:`submit()`方法会返回一个`Future`对象,可以用于判断任务是否执行完成,或者获取任务执行的结果;而`execute()`方法没有返回值。
2.异常处理不同:`submit()`方法会将任务执行过程中抛出的异常封装在`Future`对象中,可以通过`Future`对象的`get()`方法获取异常信息;而`execute()`方法只能在任务执行过程中直接抛出异常,无法通过其他方式获取异常信息。
下面是一个例子,演示了`submit()`方法和`execute()`方法的区别:
```java
import java.util.concurrent.*;
public class Test {
public static void main(String[] args) throws Exception {
ExecutorService executorService = Executors.newFixedThreadPool(4);
// submit()方法
Future<Integer> future = executorService.submit(() -> {
System.out.println("submit");
int a = 10 / 0;
return 1;
});
try {
Integer result = future.get();
} catch (Exception e) {
System.out.println("submit exception: " + e.getMessage());
}
// execute()方法
executorService.execute(() -> {
System.out.println("execute");
int a = 10 / 0;
});
}
}
```
输出结果为:
```
submit exception: java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
execute
Exception in thread "pool-1-thread-2" java.lang.ArithmeticException: / by zero
at Test.lambda$main$1(Test.java:12)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
```