4.execute與submit的區別
提交任務的方式一共有兩種,分別是execute和submit。
今天就來介紹他們兩個以及他們的區別。首先來看execute,該方法位於Xqter結合中,作用是向現實中提交reasonable任務。rub任務大家都知道,他是一個無返回值的任務,也就是他執行完是沒有返回結果給你的,所以execute只適合提交無返回值的任務。如果你的任務是有返回結果的,那麼你就得建立科爾伯任務,它是一個有返回值的任務。科博任務執行完會將任務執行結果封裝到future物件中,
然後反饋給呼叫者。調研者在通過future物件獲取結果,待會介紹submit方法時演示這些操作。回到XQ的方法本身,提交的任務如果被拒絕,則丟擲任務拒絕異常,提交的任務不能為浪,否則會丟擲空指標異常。接下來我們就來演示XQ的方法,既然要提交一個任務,我們就先編寫一個任務。任務內容是輸出當前執行緒名稱,接下來我們來執行該任務。首先將任務創建出來,然後建立一個執行緒池,這裡我們就以單個執行緒的執行緒池為例,接著呼叫XQ的方法向執行緒池中提交該任務,
最後呼叫下檔方法關閉執行緒池。至此論方法編寫完成,整個例子也編寫完成執行程式觀察執行結果。從執行結果來看,程式只輸出了一個縣城名稱。看完了execute,再來看看submit,該方法位於Xqterservice介面中,一共有三個submit方法,他們作用稍有不同,這裡我將三個方法的作用分別列舉出來,他們的返回值型別都是future型別,而且都帶飯行。任務執行結果就封裝在future物件裡面。future是一個介面,
該介面定義了與任務執行相關的功能,這是future的UML類。圖,從中我們可以看到它一共有五個可用的方法,這五個方法的作用如圖所示,大家簡單的看一下,這裡就不展開講了,下一節我們將詳細介紹future。回到submit方法本身,我們介紹第一個submit方法,它的作用是提交reasonable任務,Submit方法也可以提交任務方法返回一個future物件都無返回值了,為什麼還要返回future物件?是因為future除了獲取任務執行結果以外,
還可以觀察任務是否執行完畢以及取消任務等等操作。所以future物件你可以選擇接收,您可以選擇不接收。接下來我們來演示該方法,還是沿用之前的例子,將XQ的方法改為submit方法。submit方法返回一個future物件,這裡我們選擇先接收返回值,注意泛型當中的問號是不確定型別,你就全當ob的型別來理解就好了,呼叫future的get方法。可以獲取到任務執行結果,給的方法,有異常丟擲使用拆開起,將其捕獲輸出任務執行結果,
寫上finally程式碼塊,將關閉執行緒池的操作放入finally程式碼塊中,這樣程式無論是正常執行完畢還是發生異常,都將關閉執行緒池。例子編寫完成執行程式,觀察執行結果。從執行結果來看,程式輸出執行緒名稱和浪浪是我們獲取的任務執行結果,因為我們提交的是無返回值任務,所以結果為讓。如果我們非要給無返回值任務一個結果可不可以?那也是可以的。這就是我們要介紹的第二個submit方法,它的作用就是提交一個round任務給宣城值,
並且還可以附帶一個執行結果。別的任務都是執行完才知道結果的,這個submit方法是執行任務之前都已經知道了任務執行結果,所以它只適用於執行任務的時候,引數的場景,該方法依然是返回一個扶優球隊,像這個服要求物件裡面封裝的結果就是我們剛剛傳遞的第二個引數。接下來我們來演示該方法,還是沿用之前的例子,修改提交任務的程式碼,呼叫兩個引數的submit方法。第二個引數可以傳些什麼?你可以傳物件,你也可以傳數字,還可以傳字串,布林型別也能傳。
我們就以字串為例好了,傳遞一句任務完成,在任務完成以後打印出來,此時future的型別不再是不確定的型別,而是字串string型別。獲取任務執行結果的程式碼也需要修改,將object型別改為string型別,因為我們的任務執行結果是string型別。例子改寫完成執行改寫後的例子,觀察執行結果,從執行結果來看,程式輸出任務完成符合預期。再介紹最後一個三分泌的方法,它的作用是提交的任務,也就是有返回值的任務方法,
返回一個future。接下來我們來演示該方法,重新編寫一個需要結果的任務resulttask任務內容是計算一加一的值,實現coral介面,一加一的結果是整形,所以方形的型別是Intel,重寫扣方法返回一加一的計算結果。至此任務編寫完成。執行任務的程式碼還是沿用之前的,只不過需要將task任務改為剛剛編寫的resulttask任務。接下來提交任務的程式碼也需要修改,將第二個引數刪掉,只保留第一個引數。future泛型的型別由string改為integer,
因為任務執行結果就是integer型別,獲取任務執行結果的訪問值型別也得改,將string改為into。例子改寫完成執行。改寫後的程式觀察執行結果,從執行結果來看,程式輸出二符合預期。兩種提交任務的方式看完了,再來看看它們的區別。從位置說起,ExCo的方法位於XQ的介面中而死。你的方法位於executeorservice介面中,再來說說提交任務的類別,XQ的方法只支援提交任務ersubmit方法既支援rub任務又支援coral任務。
返回值型別方面,Execute方法無返回值,而submit方法返回future物件。這次Xcode方法和submit方法的區別介紹完了,如果大家還有什麼需要補充的,請在視訊下方留言。最後總結一下本節內容。本節介紹了提交任務的兩種方式,Execute和submit,他們各自支援的任務如圖所示,這裡就不再贅述了。在實際開發中,Submit這種方式用的比較多,我一般也在用。本節的專案程式碼地址如下,大家如果有需要的話可以先去檢視。