线程池execute OR submit
区别
在Java中,ExecutorService
是用于执行和管理线程的接口。它提供了两种常用的方法来提交任务:execute()
和submit()
。
execute()
方法:execute()
方法是ExecutorService
接口定义的方法之一。它接受一个Runnable
对象作为参数,并将其提交给ExecutorService
执行。该方法没有返回值,因此无法获取任务的执行结果。1
2ExecutorService executorService = Executors.newFixedThreadPool(5);
executorService.execute(new RunnableTask());这种方式适用于不需要获取任务执行结果的场景,例如简单的异步操作或任务执行完成后不关心其返回值。
submit()
方法:submit()
方法也是ExecutorService
接口定义的方法之一。它接受一个Callable
或Runnable
对象作为参数,并返回一个Future
对象,该对象可以用于获取任务的执行结果。1
2
3
4ExecutorService executorService = Executors.newFixedThreadPool(5);
Future<String> futureResult = executorService.submit(new CallableTask());
// 可以通过Future对象获取任务的执行结果
String result = futureResult.get();这种方式适用于需要获取任务执行结果的场景。通过
submit()
方法提交的任务可以返回一个Future
对象,可以使用该对象来检查任务是否完成、取消任务的执行以及获取任务的执行结果。
总结:
execute()
方法用于提交Runnable
任务,没有返回值。submit()
方法用于提交Runnable或Callable
任务,返回一个Future
对象,可以获取任务的执行结果。
需要注意的是,无论使用哪种方式提交任务,都需要在不再需要ExecutorService
时,调用其shutdown()
方法来关闭线程池。
异常处理
在任务处理过程中,无论是使用execute()
方法还是submit()
方法提交任务,都需要注意异常处理。下面是针对这两种方法的异常处理建议:
execute()
方法:- 使用
execute()
方法提交的任务无法通过返回值来获取执行结果,因此在任务执行过程中抛出的异常无法直接捕获。为了处理异常,可以在任务的run()
方法内部进行异常处理,确保异常不会导致整个线程池的中断。 - 可以考虑在
Runnable
实现类的run()
方法中使用try-catch
块来捕获并处理异常,或者在run()
方法内部使用日志记录异常信息。
1
2
3
4
5
6
7
8
9
10
11executorService.execute(new Runnable() {
public void run() {
try {
// 执行任务的代码
} catch (Exception e) {
// 处理异常,例如记录日志
e.printStackTrace();
}
}
});- 使用
submit()
方法:- 使用
submit()
方法提交任务时,可以通过Future
对象来获取任务执行过程中抛出的异常。可以使用Future
的get()
方法来获取执行结果,如果任务抛出异常,get()
方法会抛出ExecutionException
,其中包含了任务执行过程中的异常信息。 - 需要在调用
get()
方法时捕获ExecutionException
,并对异常进行适当的处理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20ExecutorService executorService = Executors.newFixedThreadPool(5);
Future<String> futureResult = executorService.submit(new Callable<String>() {
public String call() throws Exception {
// 执行任务的代码
return "result";
}
});
try {
String result = futureResult.get();
// 处理任务执行结果
} catch (InterruptedException e) {
// 处理中断异常
e.printStackTrace();
} catch (ExecutionException e) {
// 处理任务执行异常
Throwable cause = e.getCause();
cause.printStackTrace();
}- 使用
总结:
- 对于
execute()
方法提交的任务,建议在任务的run()
方法内部进行异常处理。 - 对于
submit()
方法提交的任务,可以通过Future
对象的get()
方法捕获并处理任务执行过程中的异常。 - 对于
submit()
方法如果不使用Future
对象,则也需要在submit()
方法中try catch 来捕获异常
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Warms!