多線程,是很多編程人員再熟悉不過的了。
在稍老一些的Java版本中,具體是在Java 5.0以前,啟動一個任務是通過調用Thread類的start()方法來實現的,任務的提交和執行時同時進行的,如果想對任務的執行進行調度,或者想控制同時執行的線程數量就需要額外編寫代碼來完成。而在Java 5.0裡提供了一個新的任務執行架構使我們可以很輕鬆地調度和控制任務的執行。這個架構主要有三個介面和其相應的類組成。這三個介面分別是:
Executor、
ExevutirService
ScheduledExecutorService
下面我們來具體說明。
Executor介面:是用來執行Runnable任務的,它值定義了一個方法:
execute(Runnable command):執行Ruannable類型的任務.
ExecutorService介面:ExecutorService繼承了Executor的方法,並提供了執行Callable任務和中指任務執行的服務,其定義的方法主要有:
submit(task):可用來提交Callable或Runnable任務,並返回代表此任務的Future對象
invokeAll(collection of tasks):批處理任務集合,並返回一個代表這些任務的Future對象集合
shutdown():在完成已提交的任務後關閉服務,不再接受新任務
shutdownNow():停止所有正在執行的任務並關閉服務。
isTerminated():測試是否所有任務都執行完畢了。
isShutdown():測試是否該ExecutorService已被關閉
ScheduledExecutorService介面:
在ExecutorService的基礎上,ScheduledExecutorService提供了按時間安排執行任務的功能,它提供的方法主要有:
schedule(task,
initDelay): 安排所提交的Callable或Runnable任務在initDelay指定的時間後執行
scheduleAtFixedRate():安排所提交的Runnable任務按指定的間隔重複執行
scheduleWithFixedDelay():安排所提交的Runnable任務在每次執行完後,等待delay所指定的時間後重複執行
_________________________________________________________________________________________________________________________________
雖然以上提到的介面有其實作類別,但是為了方便,我們建議使用Executors的工具類來得到Executor介面的具體對象,需要注意的是,Executors是一個類,不是Executor的複數形式,Executor提供了一下一些靜態方法:
callable(Runnable task):將一個Runnable的任務轉化成callable的任務
newSingleThreadExecutor:
產生一個ExecutorService對象,這個對象只有一個線程可用來執行任務,若任務多於一個,任務將按先後順序執行
newCachedThreadPool():
產生一個ExecutorService對象,這個對象帶有一個線程池,線程池的大小會根據需要調整,線程執行完任務後返回線程池,供執行下一次任務使用。
newFixedThreadPool(int
poolSize):產生一個ExecutorService對象,這個對象帶有一個大小為poolSize的線程池,若任務數量大於poolSize,任務會被放在一個queue裡順序執行
newSingleThreadScheduledExecutor:產生一個ScheduledExecutorService對象,這個對象的線程池大小為1,若任務多於一個,任務將按先後順序執行
newScheduledThreadPool(int
poolSize): 產生一個ScheduledExecutorService對象,這個對象的線程池大小為poolSize,若任務數量大於poolSize,任務會在一個queue裡等待執行