简述线程池中 submit() 和 execute() 方法有什么区别?
参考答案:
在 Java 的 java.util.concurrent.ExecutorService
接口中,submit()
和 execute()
方法都用于在线程池中执行任务,但它们在行为上存在一些重要的差异。
-
返回值:
execute()
方法没有返回值。它接受一个Runnable
任务并立即执行它,但无法获取该任务的结果。submit()
方法接受一个Callable
任务,并返回一个Future
对象。这个Future
对象代表了任务的计算结果。你可以使用Future.get()
方法来获取这个结果,但是请注意,如果任务还没有完成,get()
方法会阻塞,直到任务完成。
-
异常处理:
- 如果
Runnable
任务在execute()
方法中抛出异常,那么这个异常会被传递给UncaughtExceptionHandler
,如果没有设置UncaughtExceptionHandler
,那么这个异常会被忽略,任务会被终止。 - 如果
Callable
任务在submit()
方法中抛出异常,那么这个异常会被捕获并存储在返回的Future
对象中。当你调用Future.get()
方法时,这个异常会被重新抛出,这样你就可以捕获并处理它。
- 如果
-
任务类型:
execute()
方法只接受Runnable
类型的任务。submit()
方法可以接受Runnable
或Callable
类型的任务。如果任务类型是Runnable
,Future.get()
方法将返回null
。
因此,你应该根据你的需求来选择使用 execute()
还是 submit()
方法。如果你需要获取任务的结果,或者需要处理任务中可能抛出的异常,那么你应该使用 submit()
方法。如果你不需要获取任务的结果,也不关心任务中可能抛出的异常,那么你可以使用 execute()
方法。