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