如果返回值不是我关心的,我应该如何在 ExecutorService 的 submit或execute之间进行选择?
如果我同时测试两者,除了返回值之外,我没有看到两者之间的任何差异。
ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); threadExecutor.execute(new Task());
ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); threadExecutor.submit(new Task());
关于异常/错误处理存在差异。
排队的任务execute()生成一些Throwable将导致UncaughtExceptionHandler正在Thread运行的任务被调用。如果没有安装自定义处理程序,将调用默认值UncaughtExceptionHandler,通常将Throwable堆栈跟踪打印到。System.err
execute()
Throwable
UncaughtExceptionHandler
Thread
System.err
另一方面,Throwable队列中的任务生成的 asubmit()将绑定Throwable到Future调用 to 生成的submit()。调用get()它Future会抛出一个ExecutionException原始Throwable的作为它的原因(可以通过调用getCause()来访问ExecutionException)。
submit()
Future
get()
ExecutionException
getCause()