简述线程池中 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() 方法。