1. 方法签名和参数
-
execute(Runnable command): 这个方法接受一个实现了
Runnable
接口的任务。Runnable
接口的run
方法没有返回值,且不能抛出受检查的异常(只能抛出RuntimeException
或Error
)。 -
submit(Callable<T> task): 这个方法接受一个实现了
Callable<T>
接口的任务。与Runnable
不同,Callable
的call
方法可以返回一个结果,并且能抛出受检查的异常。此外,submit
方法还有另一个变种,它接受一个Runnable
任务和一个结果(T result
),但这种情况通常用于需要返回一个特定值(而不是任务执行的结果)的场景,且该值在任务执行前就已经确定。
2. 返回值
-
execute:
execute
方法没有返回值(即返回void
)。因此,你无法直接获取任务执行的结果或任务执行过程中的异常信息。 -
submit:
submit
方法返回一个Future<T>
对象,这个对象代表了异步计算的结果。你可以通过Future
对象查询任务是否完成、等待任务完成以及获取任务的结果或异常。
3. 异常处理
-
execute: 如果
Runnable
任务中抛出了未捕获的异常,这个异常将由ExecutorService
捕获并传递给其UncaughtExceptionHandler
(如果设置了的话)。如果没有设置处理器,则默认行为是将异常打印到标准错误输出(System.err
),但这不会阻止ExecutorService
继续执行其他任务。 -
submit: 如果
Callable
任务中抛出了异常,这个异常会被封装在返回的Future
对象中。当你调用Future.get()
方法来获取任务结果时,如果任务尚未完成,则当前线程会被阻塞直到任务完成;如果任务完成了(无论正常结束还是异常结束),get()
方法会返回结果或抛出ExecutionException
(如果任务执行过程中抛出了异常)。这允许你更灵活地处理异常。