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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值