java-使用newTaskFor封装任务中非标准取消

  • Post author:
  • Post category:java


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);

}

}

};

}

}



版权声明:本文为deepfuture原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。