取消任务
概述
使用执行器时,不需要管理线程,只需要实现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