假设提交给执行器池的任务是这样的
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
的任何可行实现都需要以这样一种方式编写,即标记为已完成涉及发布栅栏,而完成检查涉及获取栅栏。当 Future
标记为已完成时,应刷新对 heavyClass
的所有先前更改,并且应保证在任务的完成状态可见时对其他线程可见.
当然,依赖于此意味着相信实现执行器的人知道他们在做什么。如果您使用的是核心 Java 执行器之一,应该没问题。
关于Java 并发 : Changes made by task submitted to executor visible after future. get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24062816/