学习 FutureTask

来源:互联网 发布:淘宝真丝客服沟通技巧 编辑:程序博客网 时间:2024/05/19 16:37

先转载一篇讲解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

原创粉丝点击