取消任務
概述
使用執行器時,不需要管理線程,只需要實現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