多執行緒中線程執行器java5

2021-07-11 03:55:51 字數 2326 閱讀 4294

執行器框架(executor framework),圍繞著executor 介面和它的子介面executorservice,以及實現這兩個介面的threadpoolexecutor類的展開。

這套機制分離了任務的建立和執行。通過使用執行器,僅需要實現runnable介面的物件,然後將這些物件傳送給執行器即可。執行器通過建立所需的執行緒,來負責這些runnable物件的建立,例項化及執行。但執行器的功能不限於此,它使用了執行緒池來提高應用程式的效能。但傳送乙個任務給執行器時,執行器會嘗試使用執行緒池中的執行緒來執行這個任務,避免了不斷地建立和銷毀執行緒而導致系統效能下降。

執行器框架另乙個重要的優勢是callable介面。它類似於runnable介面,但是卻提供了兩方面的增強。

這個介面的主要方法名稱為call(),可以返回結果

當傳送乙個callable物件給執行器時,將獲得乙個實現future介面的物件,可以使用這個物件來控制callable物件的狀態和結果。

僅當執行緒的數量時合理的或者執行緒只會遠行很短時間時,適合採用executors工廠類的newcachedthreadpool()方法來建立執行器。

一旦建立了執行器,就可以使用執行器的execute()方法來傳送runnable或callable型別的任務。

getpoolsize():返回執行器執行緒池中實際的執行緒數

getactivecount():返回執行器中正在執行任務的執行緒數

getcompletedtaskcount():返回執行器已完成的任務數

為了完成執行器的執行,可以使用threadpoolexecutor類的shutdown()方法。

executors工廠類也提供newsinglethreadexecutor()方法。這是乙個建立固定大小執行緒執行器的極端情況,它將建立乙個只有單個執行緒的執行器。因此這個執行器只能同一時間執行乙個任務。

執行框架(executor framework)的優勢之一是,可以執行併發任務並返回結果。

callable:這個介面宣告了call()方法。callable介面是乙個泛型介面,這就意味著必須宣告call()方法返回的資料型別。

future:這個介面宣告了一些方法來獲取由callable物件產生的結果,並管理它們的狀態

submit()方法接受callable物件作為引數,並返回future物件。future物件可以使用以下兩個主要目的。

控制任務的狀態:可以取消任務和檢查任務是否完成。為了達到這個目的,可以使用isdone()方法來檢查任務是否已經完成

在呼叫future物件的get()方法時,如果future物件所控制的任務並未完成,那麼這個方法將一直阻塞到任務完成。future介面也提供了get()方法的其他呼叫方式

threadpoolexecutor類的invokeany()方法接收到乙個任務列表,然後執行任務,並返回第乙個完成任務並且沒有丟擲異常的任務的執行結果。這個方法返回的型別與任務裡的call()方法返回的型別相同

如果多個任務(兩個)都返回值,那麼invokeany()方法的結果就是首先完成任務的名稱。

如果第乙個任務返回值,第二個任務丟擲exception異常,那麼invokeany()方法的結果就是第乙個

如果第乙個任務丟擲exception異常,第二個任務返回值,那麼invokeany()方法的結果是第二個

如果都丟擲exception異常,那麼invokeany()將丟擲異常

invokeall()方法等待所有任務完成。這個方法接收乙個callable物件列表,並且返回乙個future物件列表。在這個列表中,每乙個任務對應乙個future物件。future物件列表中的第乙個物件控制callable列表中的第乙個任務,以此類推

需要注意的一點是,在儲存結果的列表宣告中,用在future介面中的泛型引數的資料型別必須與callable介面的泛型資料型別相相容

另乙個關於invokeall(),使用future物件僅用來獲取任務的結果。當所有的任務執行結束時這個方法也執行結束了,如果在返回的future物件上呼叫isdone()方法,那麼所有的呼叫將返回true

使用執行器時,不需要管理執行緒,只需要實現runnable或callable任務並傳送任務給執行器即可。執行器負責建立執行緒,管理執行緒池中的執行緒,當執行緒中不需要時就銷毀它們。有時候,我們可能需要取消已經傳送給執行器的任務。在這中情況下,可以使用future介面中的cancel()方法來執行取消操作

如果任務已經完成,或者之前已經被取消,或者是由於某種原因而不能被取消,那麼這個方法將返回false並且任務也不能取消

如果任務在執行器中等待分配thread物件來執行它,那麼任務被取消,並且不會開始執行。如果任務已經在遠行,那麼他依賴於呼叫cancel()方法是傳遞的引數。如果傳遞引數位true並且任務在執行,那麼任務將被取消。如果傳遞的引數位false並且任務正在執行,那麼任務不會被取消。

java 讀寫鎖 java5特有的 多執行緒

執行結果 寫 張三正在操作mycount賬戶,金額為 4000,當前金額為10000 寫 張三操作mycount賬戶成功,金額為 4000,當前金額為6000 寫 張三他弟正在操作mycount賬戶,金額為 8000,當前金額為6000 寫 張三他弟操作mycount賬戶成功,金額為 8000,當前...

java執行緒系列 java5中的執行緒池

public class threadpoolstest threadpools.shutdown 停掉執行緒池 定時器,隔10s後執行 executors.newscheduledthreadpool 3 schedule new runnable 10,timeunit.seconds 定時器,...

Java多執行緒中線程安全與鎖問題

無狀態的物件一定是執行緒安全的。要保持狀態的一致性,就需要在單個原子操作中更新所有相關的狀態變數。併發環境中的原子性與事務應用程式中的原子性有著相同的含義 一組語句作為乙個不可分割的單元被執行。對於可能被多個執行緒同時訪問的可變狀態變數,在訪問它的時候需要持有同一把鎖,在這種情況下,稱狀態變數是由這...