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

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

                          }

                       }

                 };

              }

       

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值