*1: 任務1正常結束
*2: 任務2是個死循環(huán),這是它的打印結果
*3: 指示任務2被取消
*4: 在執(zhí)行future3.get()時得到任務3拋出的異常
3:新的任務執(zhí)行架構
在Java 5.0之前啟動一個任務是通過調用Thread類的start()方法來實現(xiàn)的,任務的提于交和執(zhí)行是同時進行的,如果你想對任務的執(zhí)行進行調度或是控制同時執(zhí)行的線程數(shù)量就需要額外編寫代碼來完成。5.0里提供了一個新的任務執(zhí)行架構使你可以輕松地調度和控制任務的執(zhí)行,并且可以建立一個類似數(shù)據庫連接池的線程池來執(zhí)行任務。這個架構主要有三個接口和其相應的具體類組成。這三個接口是Executor, ExecutorService和ScheduledExecutorService,讓我們先用一個圖來顯示它們的關系:
圖的左側是接口,圖的右側是這些接口的具體類。注意Executor是沒有直接具體實現(xiàn)的。
Executor接口:
是用來執(zhí)行Runnable任務的,它只定義一個方法:
execute(Runnable command):執(zhí)行Ruannable類型的任務
ExecutorService接口:
ExecutorService繼承了Executor的方法,并提供了執(zhí)行Callable任務和中止任務執(zhí)行的服務,其定義的方法主要有:
submit(task):可用來提交Callable或Runnable任務,并返回代表此任務的Future對象
invokeAll(collection of tasks):批處理任務集合,并返回一個代表這些任務的Future對象集合
shutdown():在完成已提交的任務后關閉服務,不再接受新任務
shutdownNow():停止所有正在執(zhí)行的任務并關閉服務。
isTerminated():測試是否所有任務都執(zhí)行完畢了。
isShutdown():測試是否該ExecutorService已被關閉
ScheduledExecutorService接口
在ExecutorService的基礎上,ScheduledExecutorService提供了按時間安排執(zhí)行任務的功能,它提供的方法主要有:
schedule(task, initDelay): 安排所提交的Callable或Runnable任務在initDelay指定的時間后執(zhí)行。
scheduleAtFixedRate():安排所提交的Runnable任務按指定的間隔重復執(zhí)行
scheduleWithFixedDelay():安排所提交的Runnable任務在每次執(zhí)行完后,等待delay所指定的時間后重復執(zhí)行。
代碼:ScheduleExecutorService的例子
public class ScheduledExecutorServiceTest {
public static void main(String[] args)
throws InterruptedException, ExecutionException{
//*1
ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
//*2
Runnable task1 = new Runnable() {
public void run() {
System.out.println("Task repeating.");
}
};
//*3
final ScheduledFuture future1 =
service.scheduleAtFixedRate(task1, 0, 1, TimeUnit.SECONDS);
相關推薦:計算機等級考試二級Java經典算法大全匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |