1、使用newTaskFor钩子函数来改进用来封装非标准取消的方法。这是ThreadPoolExecutor的新特性。
2、当提交一个callable给ExecutorService时,submit返回一个Future,可以用Future来取消任务。
3、newTaskFor钩子是一个工厂方法,创建一个Future来代表任务,这个Future属于由FutureTask实现的RunnableFuture接口,这个接口可以自定义cancel方法,实现自定义的取消方式。
4、
//定义接口,这个接口是必须实现的自定义cancel方法,因为cancel方法定义在FutureTask中,
//而newTask必须返回FutureTask,所以newTask方法也必须自定义。
public interfaceCancellableTask<T> extendsCallable<T>{
voidcancel();
RunnableFuture<T>newTask();
}
@ThreadSafe
//JAVA6时,提交任务给ThreadPoolExecutor时,可以重写newTaskFor函数,newTaskFor是工厂
//方法,即它创建了FutureTask来代表任务。
public class CancellingExecutor extends ThreadPoolExecutor{
….
….
protected<T>RunnableFuture<T>newTaskFor(Callable<T> callable){
if (callable instanceof CancellableTask)
return
((CancellableTask<T>)callable).newTask();
else
return super.newTaskFor(callable);
}
}
//重点部分,该部分实现了CancellableTask,自定义了cancel方法和newTask方法,以完成newTaskFor函数对CancellableTask的需要。
public stract classSocketUsingTask<T> implements CancellableTask<T>{
@GuardBy(“this”) private Socket socket;
protected synchronized void setSocket(Socket s){socket=s;}
public synchronized void cancel(){
try{
if (socket!=null) socket.close();
}
catch (IOException ignored){}
}
public RunnableFuture<T>newTask(){
return new FutureTask<T>(this){
publicboolean cancel(boolean mayInterruptIfRunning){
try{
socketUsingTask.this.cancel();
}
finally{
returnsuper.cancel(mayInterruptIfRunning);
}
}
};
}
}