在 Java 中,`ExecutorService` 接口定义了线程池的基本功能,其中包含了 `submit()` 和 `execute()` 两种方法,它们有一些区别:
1. 返回值:
`submit()` 方法可以接受 `Callable` 或 `Runnable` 类型的任务,并返回一个 `Future` 对象,你可以通过 `Future` 对象获取任务的执行结果或者取消任务执行。
`execute()` 方法只接受 `Runnable` 类型的任务,并且没有返回值。
2. 异常处理:
`submit()` 方法可以捕获任务执行过程中抛出的异常,你可以通过 `Future` 对象来获取任务执行过程中抛出的异常。
`execute()` 方法无法直接捕获任务执行中的异常,需要在任务内部进行异常处理,否则可能导致线程池中的线程被异常终止。
3. 方法来源:
`execute()` 方法是 `Executor` 接口中定义的方法,较为简单,用于执行 `Runnable` 任务。
`submit()` 方法是 `ExecutorService` 接口中定义的方法,在 `Executor` 的基础上增加了任务提交后可以获取任务执行结果的能力。
通常来说,如果你需要提交一个任务到线程池并且需要获取任务执行的结果或者对执行过程中的异常进行处理,那么可以选择使用 `submit()` 方法。如果只是简单地提交一个任务到线程池并不关心任务的返回结果,`execute()` 方法也是一个不错的选择。