学习 FutureTask

先转载一篇讲解FutureTask的博客:
深入学习FutureTask

public class TestTask implements Callable<String> {
    private String name;

    public TestTask(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String call() throws Exception {
        System.out.println(name + " TestTask is running");
        return "TestTask";
    }
}

测试1:
如果task线程任务还未执行,调用cancel(false),线程任务不会被执行。

 public static void  main(String[] args){

        final ExecutorService executor = Executors.newCachedThreadPool();
        TestTask task = new TestTask("zeng");
        final FutureTask<String> futureTask = new FutureTask<String>(task);
        //确保取消操作在线程执行之前操作
        Timer timer=new Timer();//实例化Timer类
        timer.schedule(new TimerTask(){
            public void run(){
                executor.submit(futureTask);
                System.out.println(futureTask.isDone());
            }
        },1000);
        futureTask.cancel(false);
//        futureTask.cancel(true);
    }

测试结果:无法打印is running,isDone结果为true
源码中将状态值按照从小到大排序,最终态也按照相同类型统一分布,这个思路很棒,有些地方可以借鉴下

    private static final int NEW          = 0;
    private static final int COMPLETING   = 1;
    private static final int NORMAL       = 2;
    private static final int EXCEPTIONAL  = 3;
    private static final int CANCELLED    = 4;
    private static final int INTERRUPTING = 5;
    private static final int INTERRUPTED  = 6;
public boolean isCancelled() {
        return state >= CANCELLED;
    }

    public boolean isDone() {
        return state != NEW;
    }

测试2:线程任务执行过程中,执行cancel(false)

public String call() throws Exception {
        System.out.println(name + " TestTask is running");
        for(int i=0;i<1000;i++){
            System.out.println("task run times:" + i);
        }
        return "TestTask";
    }
 public static void  main(String[] args){

        final ExecutorService executor = Executors.newCachedThreadPool();
        TestTask task = new TestTask("zeng");
        final FutureTask<String> futureTask = new FutureTask<String>(task);
        executor.submit(futureTask);
        System.out.println("prepare to cancel");
        futureTask.cancel(false);
        //执行完cancel,把线程让出来,看子线程会不会继续执行
        Thread.yield();
        System.out.println(futureTask.isCancelled());
        System.out.println(futureTask.isDone());
        return;
    }

测试结果:在子任务执行过程中,执行cancel(false),状态会变,但是子任务不会停止
prepare to cancel
zeng TestTask is running
true
task run times:0
true
task run times:1
task run times:2
task run times:3
task run times:4
task run times:5
task run times:6

测试3:线程任务执行结束,执行cancel(false)

 public String call() throws Exception {
        System.out.println(name + " TestTask is running");
        return "TestTask";
    }
    public static void  main(String[] args){

        final ExecutorService executor = Executors.newCachedThreadPool();
        TestTask task = new TestTask("zeng");
        final FutureTask<String> futureTask = new FutureTask<String>(task);
        executor.submit(futureTask);
        try {
            Thread.sleep(500);
            System.out.println("prepare to cancel");
            futureTask.cancel(false);
            System.out.println(futureTask.isCancelled());
            System.out.println(futureTask.isDone());

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

测试结果:当任务结束时取消,状态并不会改变,也就是说不会取消任务
zeng TestTask is running
prepare to cancel
false
true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值