小编con*_*yev的帖子

如何测试java Future是否完整?

我正在跟踪标准Future对象的任务执行情况.该任务有以下有效状态(正如我在AbstractFuture类的Guava代码中看到的):

  • 跑步 ;
  • 完成 ;
  • 成功完成或例外;
  • 取消 ;
  • 中断.

Future.isDone()true当且仅当状态完成,取消中断时才返回.当且仅当状态被中断取消时才Future.isCancelled()返回.true

好的,但我需要检查任务是否完成.有一种明显的方法可以做到这一点:

boolean isCompleted = future.isDone() && !future.isCancelled();
Run Code Online (Sandbox Code Playgroud)

不幸的是,一个讨厌的并发错误隐藏在那里.

  1. 线程#1调用future.isCancelled().结果是false,因为任务仍在进行中.
  2. 线程#2取消任务调用future.cancel().
  3. 线程#1调用future.isDone().结果是true现在.
  4. 评估上面的表达产生true,这是不正确的答案.

如何避免这个问题?

java concurrency java.util.concurrent

6
推荐指数
1
解决办法
2920
查看次数

Elm 0.19 中的可扩展记录没用吗?

可扩展记录是 Elm 最令人惊奇的功能之一,但自 v0.16 以来,添加和删除字段不再可用。这让我处于尴尬的境地。

考虑一个例子。我想给一个随机的东西命名t,可扩展记录为我提供了一个完美的工具:

type alias Named t = { t | name: String }
Run Code Online (Sandbox Code Playgroud)

“好的,”编译器说。现在我需要一个构造函数,即一个事物配备指定名称的函数:

equip : String -> t -> Named t
equip name thing = { thing | name = name }  -- Oops! Type mismatch
Run Code Online (Sandbox Code Playgroud)

编译失败,因为{ thing | name = ... }语法假定thing是带有name字段的记录,但类型系统不能保证这一点。事实上,Named t我试图表达一些相反的东西:t应该是一个没有自己name字段的记录类型,并且该函数将此字段添加到记录中。无论如何,字段添加是实现equip功能所必需的。

因此,equip以多态方式编写似乎是不可能的,但这可能不是什么大问题。毕竟,任何时候我要给一些具体的东西命名时,我都可以手动完成。更糟糕的是,逆函数extract : Named t -> …

elm

5
推荐指数
1
解决办法
1215
查看次数

标签 统计

concurrency ×1

elm ×1

java ×1

java.util.concurrent ×1