Java 執行緒池中 submit 和 execute 方法有什麼區別?

時間 2021-07-07 13:03:14

1樓:chengco

實際上,它們的區別是Executor與ExecutorService的區別。先看怎麼用,舉個例子:

ExecutorService

executorService

=Executors

.newSingleThreadExecutor

();Future

<?>

runnableFuture

=executorService

.submit

(()->

System

.out

.println

("run"

));// submit乙個Runnable任務

Future

<?>

callableFuture

=executorService

.submit

(()->

"call"

);// submit乙個Callable任務

executorService

.execute

(()->

System

.out

.println

("test"

));System

.out

.println

(runnableFuture

.get

());

// Output null

System

.out

.println

(callableFuture

.get

());//

Output

call

所以,區別是:

execute只可接收Runnable物件,而submit既可接收Runnable物件又可接收Callable物件;因為submit方法可接收Callable物件,所以可以有通過Future獲取返回結果,而execute則做不到。

為什麼會有這個區別?

execute方法定義在Executor介面(只有乙個方法),而submit定義在ExecutorService介面,它們的關係是:

從字面意思可以看出,Executor是執行器,而ExecutorService是執行服務,ExecutorService繼承了Executor,除了提供執行任務的能力(扔進執行緒池去執行),重點是提供了任務生命週期的管理能力(停止執行緒池,中斷某個任務),而每個任務的Future返回值正是為此目的,細品它的介面設計就明白了:

java執行緒池(newFixedThreadPool)執行緒消失疑問?

原始碼看不看不重要,建議詳細看一下 jdk 自帶執行緒池的文件。jdk 自帶執行緒池中線程何時銷毀是由執行緒池的多個引數綜合決定的,所以使用者提交的執行緒中是否丟擲了異常對執行緒池中線程的銷毀是沒有影響的。如果使用者提交的執行緒丟擲了異常會退出使用者執行緒的 run 方法,執行執行緒是否需要銷毀由執...

java多執行緒問題求解?

Allen 沒有解決資料競爭問題需要用一把共有的鎖而不是同步方法因為那相當於乙個執行緒一把鎖 簡單修改成 inta private Object object new Object private volatile Integeri 0 static Lock lock new ReentrantL...

Java執行緒池應該如何使用?

半圓學社 執行緒池應該在程式啟動的時候進行初始化,中間只要不出現異常或沒有特殊需求則可以不關閉。執行緒的建立和銷毀要花費時間,使用執行緒池可以復用執行緒,執行緒池可以設定核心執行緒數量,核心執行緒處理完任務後,並不會銷毀,而是保持空閒直到下一次有執行緒需要建立時,直接執行任務。 隨心隨意 說點我的理...