3.4 取消任務

取消任務

概述

使用執行器時,不需要管理線程,只需要實現Runnable或Callable任務併發送任務給執行器即可。執行器負責創建線程,管理線程池中的線程,當線程不再需要時就銷燬它們。有時候,我們可能需要取消已經發送給執行器的任務,這種情況下,可以使用Future接口的cancel方法來取消任務。


cancel方法取消任務的執行有如下幾種:

  • 如果任務已經完成,或者之前已經被取消,或者由於某種原因而不能取消,那麼方法返回false,並且任務也不被取消
  • 如果任務在執行器中等待分配Thread對象來執行,那麼任務將被取消,並且不會開始執行。如果任務已經開始執行則依賴於cancel方法的參數。如果實參是true並且任務正在運行,則任務將被取消;如果實參是false並且任務正在運行,那麼任務不會被取消。


示例

下面示例演示瞭如何取消任務:
public class CancelExecutor {
    public static void main(String[] args){
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
        CancelTask task = new CancelTask();

        System.out.println("main:運行執行器");
        Future<String> result = executor.submit(task);

        System.out.println("main:休眠1s");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("main:取消任務");
        result.cancel(true);

        System.out.println("main:任務取消:" + result.isCancelled());
        System.out.println("main:任務完成:" + result.isDone());

        System.out.println("main:結束任務");
        executor.shutdown();

        System.out.println("main:退出");
    }
}

class CancelTask implements Callable<String>{

    @Override
    public String call() throws Exception {
        while(true){
            System.out.println("Task:Test");
            Thread.sleep(100);
        }
    }
}

程序運行日誌:
main:運行執行器
main:休眠1s
Task:Test
Task:Test
Task:Test
Task:Test
Task:Test
Task:Test
Task:Test
Task:Test
Task:Test
Task:Test
main:取消任務
main:任務取消:true
main:任務完成:true
main:結束任務
main:退出
Task:Test



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章