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

2023-11-17

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

                          }

                       }

                 };

              }

       

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java-使用newTaskFor封装任务中非标准取消 的相关文章

随机推荐

  • ADS1.2出现erro starting external process,Process error code 87(0x57)参数错误的解决办法

    系统兼容问题 在ADS的兼容性上选择xp sp2兼容模式 以管理员权限启用
  • Qt使用QScrollArea滚动条动态添加按键

    mainwindow h ifndef MAINWINDOW H define MAINWINDOW H include
  • 一篇文章吃透 CSS3 属性: transition过渡 与 transform动画

    最近有人私信我 CSS 中的 transition 过渡 和 transform 动画 属性 这两个属性的参数确实比较复杂 它们可以做出 CSS 的一些基础动画效果 平移 旋转 倾角 等等 这些也是我早期学习 CSS 的难记易忘之处 今天给
  • c语言中n的阶乘的流程图,n的阶乘流程图(计算机n的阶乘流程图)

    n的阶乘流程图 计算机n的阶乘流程图 2020 05 24 15 32 32 共10个回答 第一步 让s 1 i 1第二步输入要算的阶乘的对应的正整数n第三步让s s i i i 1第四步判断i是否大于n 若大于打印出S否则返回第三步s 1
  • (四)activiti7大服务service详解——2 RuntimeService

    前言 在 Activiti 中 每当一个流程定义被启动一次之后 都会生成一个相应的流程对象实例 Runtime Service 提供了启动流程 查询流程实例 设置获取流程实例变量等功能 此外它还提供了对流程部署 流程定义和流程实例的存取服务
  • mysql学习笔记(2)_DML(Data Manipulation Language)

    DML Data Manipulation Language 数据操作语言 插入数据 insert 修改数据 update 删除数据 delete DML Data Manipulation Language 数据操作语言 插入语句 方式一
  • C++实现堆排序算法

    C 实现堆排序算法 堆排序是一种高效的排序算法 它的时间复杂度为O nlogn 同时也非常稳定 该算法使用了堆的数据结构来实现排序 堆通常使用数组实现 下面就让我们来看看如何使用C 来实现堆排序算法 首先 我们需要了解堆的定义和性质 堆是一
  • unity工程运行一段时间堆栈溢出,unity崩溃fatal error in GC. stack overflow

    在这里做一下标记 困扰了我一天的难题 就是栈溢出导致软件奔溃的问题 gc报错 堆栈溢出 代码问题 没有指出具体溢出位置 需要自己慢慢排查 多个个脚本大量的代码排查起来很艰难 首先要抓住的重点位置 1 使用whiletrue的地方 2 使用递
  • 数据库开发考试复习

    文章目录 B树索引结构 B树索引的结构和使用方式 B树索引的使用 什么时候使用B树索引 为什么为外键建立索引是普遍的要求 上面一个问题的例外情况 IOT 大概率不考 B树索引练习 索引 系统生成键 含有索引但未使用的几种情况 位图索引 哈希
  • Unity的C#编程教程_62_语言集成查询 LINQ 详解及应用练习

    文章目录 LINQ Querys 1 Any 2 Contains 3 Distinct 4 Where Challenge Hands on with LINQ LINQ Order by Descending Challenge Fil
  • 代码注释:机器学习实战第8章 预测数值型数据:回归

    写在开头的话 在学习 机器学习实战 的过程中发现书中很多代码并没有注释 这对新入门的同学是一个挑战 特此贴出我对代码做出的注释 仅供参考 欢迎指正 coding gbk from numpy import 作用 从文件中导入数据 输入 文件
  • RocketMQ系列之架构浅谈

    RMQ的架构设计 下面我从GitHub上截取了一张RMQ的源码结构图 图中我框框出来的9大模块 基本就构成了整个RMQ的内部结构 上面9大模块的依赖层次主要如下 依赖越强的越处于底层 下面介绍下最上层的4个模块 这4个模块中工具命令行就不讲
  • 使用cpio命令导致系统几乎崩溃的一次经历

    做嵌入式linux开发 内核编译生成了一个initramfs data cpio文件 发现是一个根文件系统的压缩文件 在windows下可以用IZArc解压 但不能用tar gunzip解压 Windows下使用IZArc解压时 符号链接文
  • CentOS 8 逻辑卷管理LVM详解(扩容、快照等)

    逻辑卷管理LVM 一 概述 二 逻辑卷管理布局 三 LVM1和LVM2 四 使用LVM管理逻辑卷 1 物理卷 1 创建物理卷 2 删除物理卷 2 卷组 1 创建卷组 2 扩展卷组 3 删除卷组 4 减小卷组 3 逻辑卷 1 创建逻辑卷 2
  • 基于TCP的socket通信

    本文转载自http blog csdn net chocolate001 article details 6612201 基于TCP 面向连接 的socket编程 分为客户端和服务器端 客户端的流程如下 1 创建套接字 socket 2 向
  • 修片要点+规则

    一 曝光度 相机的曝光补偿 1 1 快速修改 1 2 细改 二 对比度 白和黑的对比程度 黑的更黑 白的更白 越小越朦胧 越大越清晰 可以让色彩更鲜艳 2 1 設置對比度 三 高光 控制高光部分的曝光度 3 1 設置高光 四 阴影 控制阴影
  • 微服务契约测试框架-Pact

    契约测试 契约测试的思想就是将原本的 Consumer 与 Provider 间同步的集成测试 通过契约进行解耦 变成 Consumer 与 Provider 端两个各自独立的 异步的单元测试 契约测试的优点 契约测试与单元测试以及其它测试
  • PT100所谓的二线制,三线制,四线制如何接线(详解)

    PT100所谓的二线制 三线制 四线制如何接线 铂热电阻是利用铂丝的电阻值随着温度的变化而变化的 那么铂热电阻的三种接线方法以及消除误差的原理是怎么样的呢 二线制 二线制 在热电阻的两端各连接一根导线来引出电阻信号的方式叫二线制 这种引线方
  • PyOpenGL帧缓存

    安装 python m pip install PyOpenGL PyOpenGL accelerate i http mirrors aliyun com pypi simple trusted host mirrors aliyun c
  • java-使用newTaskFor封装任务中非标准取消

    1 使用newTaskFor钩子函数来改进用来封装非标准取消的方法 这是ThreadPoolExecutor的新特性 2 当提交一个callable给ExecutorService时 submit返回一个Future 可以用Future来取