假设提交给执行者池的任务看起来像

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的核心执行程序之一,那应该没问题。

07-24 19:48