首頁 > 其他

java快速理解和使用invokeall進行多執行緒程式設計

2019-12-10 14:07:41

invokeall是在Java多執行緒變成之中,經常用來批次呼叫資料和批次返回資料,本篇文章將會幫助你快速理解和使用invokeall方法,希望讀者在閱讀之後可以學有所得。

1

第一點,很多人其實並不知道invokeall屬於哪一種方法,這裡我要做一個說明,invokeall方法屬於java多執行緒框架Executor中的ExecutorService方法,如果您對Executor框架尚不清楚,可以看一下本人的關於java的Executor多執行緒框架的經驗講解。

下圖為javaExecutor多執行緒的圖解:


2

如果你對Executor框架已經了解,或者是並不感興趣,那我們就接下來繼續看invokeall的方法和具體使用操作吧!

下圖為Executor框架的概要:


3

ExecutorService的invokeAll這個方法是有兩種用法的:

第一個用法是exec.invokeAll(tasks)

而第二個用法是exec.invokeAll(tasks, timeout, unit)

顯然這是兩兩個函數是過載的方式,一個只有1個引數tasks,第二個由三個引數構成。下面我來簡要介紹一下三個引數分別是什麼:

tasks:任務集合,就是所有將在多執行緒環境下跑的work。

timeout:顧名思義,超時時間,即允許這個多執行緒執行的最長時間,超過就關閉執行緒。

unit:前者(timeout)的時間單位,其實我蠻好奇為什麼要多設一個時間單位的,個人覺得統一時間單位其實也是ok的。

下圖還有使用這倆函數需要import的內容。


4

相比說了這麼多,讀者自己也應該能明白這兩個invokeall的區別了吧,第一個,沒有超時時間的設定,一直執行直到完成任務為止,雖然有較長的記憶體占用時間,但是這也意味著執行時間中途是沒有任何輸出的,想看結果只能苦苦等待。而第二個有時間的設定,就好了很多了。對於是否超時,我們可以通過future.get()方法返回的值和我們設定的timeout進行比較即可。ps:務必切記,第二個設定的timeout是全域性所有執行緒的超時時間而不是單個執行緒的,超過這個時間,整個執行緒池都會關閉,切記!!!

5

當然,他們屬於同一種方法,他們也有共同的功能。他們都是處理一個collection容器,處理過後返回一個Future容器。這兩個容器雖然名稱不同,但是結構是一模一樣的。並且提交的collection列表和我們所得到的future列表有著順序上一一對應的關係,一一對應,這個可是重點哦!

6

*** ?說到返回值容器和處理容器結構相同,內容順序對應,相比聰明的讀者們肯定想到這個invokeall方法肯定是可以疊代的,把上一次操作的結果作為下一次操作的輸入,可以實現invoke的多層次迭代操作。

7

說了這麼多,我們來實戰舉個小例子吧,下面這個例子簡潔明瞭的介紹了invokeall的具體使用方法,當了解了以上的只是以後,這段程式碼看上去是不是很好用、很簡單呢?




IT145.com E-mail:sddin#qq.com