1. 程式人生 > >多線程ExecutorService中submit和execute區別

多線程ExecutorService中submit和execute區別

拋出異常 .exe exceptio mina exp check urn trace extend

submit和execute都是 ExecutorService 的方法,都是添加線程到線程池中。

區別

三個區別:

1、接收的參數不一樣

2、submit有返回值,而execute沒有

Method submit extends base method Executor.execute by creating and returning a Future that can be used to cancel execution and/or wait for completion.

用到返回值的例子,比如說我有很多個做validation的task,我希望所有的task執行完,然後每個task告訴我它的執行結果,是成功還是失敗,如果是失敗,原因是什麽。然後我就可以把所有失敗的原因綜合起來發給調用者。

個人覺得cancel execution這個用處不大,很少有需要去取消執行的。

而最大的用處應該是第二點。

3、submit方便Exception處理

There is a difference when looking at exception handling. If your tasks throws an exception and if it was submitted with execute this exception will go to the uncaught exception handler (when you don‘t have provided one explicitly, the default one will just print the stack trace to System.err

). If you submitted the task with submit any thrown exception, checked or not, is then part of the task‘s return status. For a task that was submitted with submit and that terminates with an exception, the Future.get will rethrow this exception, wrapped in an ExecutionException.

意思就是如果你在你的task裏會拋出checked或者unchecked exception,而你又希望外面的調用者能夠感知這些exception並做出及時的處理,那麽就需要用到submit,通過捕獲Future.get拋出的異常。

當我們考察異常處理的時候,又會發現另外一個不同。當你使用execute提交的任務拋出異常時,此異常將會交由未捕捉異常處理過程來處理(uncaught exception handler),當你沒有顯式指定一個異常處理器的話,默認情況下僅僅會通過System.err打印出錯誤堆棧。當你用submit來提交一個任務的時候,這個任務一旦拋出異常(無論是否是運行時異常),那這個異常是任務返回對象的一部分。對這樣一種情形,當你調用Future.get()方法的時候,這個方法會重新拋出這個異常,並且會使用ExecutionException進行包裝

多線程ExecutorService中submit和execute區別