扩展FutureTask,如何处理取消

2024-01-31

我已经延长了FutureTask from java.util.concurrent提供回调来跟踪提交给任务的执行情况ExecutorService.

public class StatusTask<V> extends FutureTask<V> {

    private final ITaskStatusHandler<V> statusHandler;

    public StatusTask(Callable<V> callable, ITaskStatusHandler<V> statusHandler){
        super(callable);
        if (statusHandler == null)
            throw new NullPointerException("statusHandler cannot be null");
        this.statusHandler = statusHandler;
        statusHandler.TaskCreated(this);
    }

    @Override
    public void run() {
        statusHandler.TaskRunning(this);
        super.run();
    }

    @Override
    protected void done() {
        super.done();
        statusHandler.TaskCompleted(this);
    }

}

现在,我看到的是任务是否已提交,但最终排队并且我cancel(true);任务——run()方法仍然被调用 - 并且FutureTask.run()(可能)检查任务是否已取消并且不调用包装的可调用对象。

我应该这样做吗?

@Override
public void run() {
  if(!isCancelled()) {  
    statusHandler.TaskRunning(this);
    super.run();
  }
}

或者我还是应该打电话super.run()?这两种方法似乎都容易受到检查取消和执行某些操作之间的竞争条件的影响......任何想法都值得赞赏。


你说得对,那里有一场比赛。FutureTask#done()将被称为最多一次,所以如果任务在通过运行之前已经被取消RunnableFuture#run(),您将会错过以下电话:FutureTask#done().

您是否考虑过一种更简单的方法,该方法始终发出一组对称的配对调用ITaskStatusHandler#taskRunning() and ITaskStatusHandler#taskCompleted(),像这样?

@Override
public void run() {
  statusHandler.TaskRunning(this);
  try {
    super.run();
  finally {
    statusHandler.TaskCompleted(this);
  }
}

Once RunnableFuture#run()被称为,确实你的任务正在运行,或者至少试图被运行。一次FutureTask#run()完成后,您的任务不再运行。碰巧的是,在取消的情况下,过渡(几乎)是立即的。

试图避免打电话ITaskStatusHandler#taskRunning()如果内部Callable or Runnable永远不会被调用FutureTask#run()将要求您在之间建立一些共享结构Callable or RunnableFutureTask-派生类型本身,这样当你的内部函数第一次被调用时,你可以设置一些标志来表明外部函数FutureTask-派生类型可以观察为闩锁,表明是的,该函数确实开始运行before已被取消。但是,到那时,您必须承诺致电ITaskStatusHandler#taskRunning(),所以这种区别不是很有用。

我最近一直在努力解决类似的设计问题,最后决定采用对称设计before and 手术后在我的重写中FutureTask#run() method.

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

扩展FutureTask,如何处理取消 的相关文章

随机推荐

  • Android SQLiteOpenHelper - 每个表都有不同的类?

    我正在读这篇文章 http www vogella com tutorials AndroidSQLite article html http www vogella com tutorials AndroidSQLite article
  • 像 TinyPNG 这样的图像优化 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在 Google 上搜索过一个好的 Mass Image Optimizer 可以在 Windows
  • 如何从 Android 中的菜单项调用 Activity?

    我试图通过单击菜单按钮来调用 startActivity myIntent 但我的应用程序此时崩溃了 通过常规按钮单击 相同的 startActivity 调用可以正常工作 因此 我认为菜单按钮缺少有关上下文的信息 或者也许我在这里完全偏离
  • 将 jQueryUI 可排序列表与表单一起使用

    我正在使用 jQueryUI 创建一个可排序列表 并且 UI 部分工作得很好 因为我可以根据需要在网页上对项目进行排序 但我不知道排序列表的顺序是如何包含在 POST 中的 我对 javascript 完全是菜鸟 所以如果这真的很简单 请原
  • TimeSpan 转 ISO8601 持续时间格式字符串

    任何人都可以建议如何将时间跨度或整数转换为 ISO8601 持续时间字符串 如中所述http en wikipedia org wiki ISO 8601 Durations http en wikipedia org wiki ISO 8
  • WPF 验证器类似于 ASP.NET 中的验证器

    我们如何在 WPF 应用程序中实现类似于 ASP NET 应用程序的验证器 如必填字段验证器 提前致谢 None
  • 如何在 Cypress e2e 测试中使用 Angular Store

    我需要在我的 Angular Store 中注入一个值 调度一个操作 以使我的 Cypress e2e 测试正常工作 事实上 我需要我的商店包含 isLoggedIn true 来访问应用程序中的任何页面 否则用户将被重定向到登录页面 我在
  • 使用 visNetwork 动态更新 R 中的节点

    下面的快照视觉效果是使用 visNetwork 包创建的 我这里的要求是我必须对边缘进行硬编码 并且在使用 visHierarchicalLayout 之后 我无法按顺序看到它们 请帮助我采用动态方法 这样无论有多少个数字 我都会得到连续的
  • 查找字符串中某个字符的所有出现位置

    我试图找到所有出现的 在一个字符串中 def findSectionOffsets text startingPos 0 endPos len text for position in text find startingPos endPo
  • Eclipse 字体缩小和放大问题

    如何在 Eclipse 中放大和缩小文本 我找到了插件 但无法手动安装 请告诉我在 Eclipse 中安装不同插件的过程 我在使用 Android 开发工具 Eclipse 遇到很多问题后问了这个问题 查看此链接 您一定会喜欢它Eclips
  • 使用 PHP 整理多个 JavaScript 文件是否比单独包含它们更快?

    我知道提供多个小文件比提供一个大文件要慢得多 这就是为什么最好使用单个 CSS 文档和精灵表 一段时间以来 我还尝试在尽可能少的文件中包含尽可能多的 JavaScript 以避免查看者多次请求更多文件 但是在同一个文档中包含各种明显不同的任
  • Python 子进程因命名管道而挂起

    I m 挣扎在试图模仿这个简单的片段bash cat tmp fifo tub 1 24027 gunzip c tmp filedat dat gz gt tmp fifo tub line 01 line 02 line 03 line
  • 如何知道 python-docx 中的新段落何时导致新页面

    我必须使用动态创建Word文档python docx 我通过动态添加表行来实现这一点 并且无法知道页面上适合多少条记录 因为这取决于特定的数据 我需要知道添加到文档 表行或段落 的新元素何时会导致新页面 因此我可以根据每个页面包含的信息在数
  • 通过融合查看分支的差异?

    我知道我可以查看 HEAD 和当前状态之间的差异meld 但是我如何查看分支之间的差异 例如master and devel与融合 目前我执行以下步骤 重命名工作副本的文件夹例如mv projectA projectA master 再次克
  • 有没有办法在 Python 中推断日期是否是 DST(夏令时)更改的实际日期?

    我想在Python中推断日期是否是一年中由于DST 夏令时 而改变小时的实际日期 与图书馆pytz您可以本地化日期时间 并且实际的 DST 更改已正确完成 此外 还有一个方法dst 图书馆的datetime这使您可以推断实际日期是夏季还是冬
  • iOS 设备上安装的所有应用程序的列表及其在主屏幕 (Springboard) 上的位置

    我几天来一直在寻找有关如何获取运行 iOS gt 5 0 的设备上已安装应用程序列表的下降答案 com apple mobile installation plist 我尝试过来自不同来源的代码 我得到的唯一几乎成功的解决方案是使用 Dan
  • 是否可以解耦 Eclipse 的代码索引功能?

    我正在寻找为大学课程编写一个静态分析器 为了为该工具提供更多功能 我希望能够查找调用层次结构 如 Eclipse 中的 Ctrl Alt H 所做的那样 这也必须是一个快速操作 因此查找可能必须针对索引而不是字节码扫描来完成 然而 我认为编
  • Jquery 无法读取 Internet Explorer 上的自定义标记文本

    我想在我的 html 页面中使用自定义标签并使用 jquery 读取其中的文本 就像是
  • 合并可跨越对象时出错

    我想合并 3 个可跨越的对象 这段代码工作正常 Spannable s1 new SpannableStringBuilder bold s1 setSpan new StyleSpan android graphics Typeface
  • 扩展FutureTask,如何处理取消

    我已经延长了FutureTask from java util concurrent提供回调来跟踪提交给任务的执行情况ExecutorService public class StatusTask