假设提交给执行者池的任务看起来像
class Task implements Future<Boolean> {
public HeavyClass heavyClass;
public Task(HeavyClass heavyClass) {
this.heavyClass = heavyClass;
}
public Boolean call() {
try {
//do changes to heavyClass
return true;
} catch(Exception e) {
return false;
}
}
现在我在调用线程中
Future<boolean> future = executor.submit(new Task(heavyClass));
try {
boolean success = future.get();
if (success) {
//Assume all changes made to heavyClass are visible
}
}
这是正确的吗?根据我的理解,这并不完全正确。在这种情况下确保纠正的最佳方法是什么?
最佳答案
没关系Future
的任何可行实现都需要以以下方式编写:将其标记为完成涉及释放防护,而检查完成涉及获取防护。当heavyClass
标记为已完成时,应清除对Future
的所有先前更改,并应保证在任务的完成状态可见时,其他线程可以看到。
当然,依赖于此意味着要相信执行者的执行者知道他们在做什么。如果您使用的是Java的核心执行程序之一,那应该没问题。