跳到主要内容

简述线程池中 submit() 和 execute() 方法有什么区别?

参考答案:

在 Java 的 java.util.concurrent.ExecutorService 接口中,submit()execute() 方法都用于在线程池中执行任务,但它们在行为上存在一些重要的差异。

  1. 返回值

    • execute() 方法没有返回值。它接受一个 Runnable 任务并立即执行它,但无法获取该任务的结果。
    • submit() 方法接受一个 Callable 任务,并返回一个 Future 对象。这个 Future 对象代表了任务的计算结果。你可以使用 Future.get() 方法来获取这个结果,但是请注意,如果任务还没有完成,get() 方法会阻塞,直到任务完成。
  2. 异常处理

    • 如果 Runnable 任务在 execute() 方法中抛出异常,那么这个异常会被传递给 UncaughtExceptionHandler,如果没有设置 UncaughtExceptionHandler,那么这个异常会被忽略,任务会被终止。
    • 如果 Callable 任务在 submit() 方法中抛出异常,那么这个异常会被捕获并存储在返回的 Future 对象中。当你调用 Future.get() 方法时,这个异常会被重新抛出,这样你就可以捕获并处理它。
  3. 任务类型

    • execute() 方法只接受 Runnable 类型的任务。
    • submit() 方法可以接受 RunnableCallable 类型的任务。如果任务类型是 RunnableFuture.get() 方法将返回 null

因此,你应该根据你的需求来选择使用 execute() 还是 submit() 方法。如果你需要获取任务的结果,或者需要处理任务中可能抛出的异常,那么你应该使用 submit() 方法。如果你不需要获取任务的结果,也不关心任务中可能抛出的异常,那么你可以使用 execute() 方法。