在执行者提交()后,一个Future立即为isDone()立即返回false

时间:2014-06-24 11:36:53

标签: java future executor

无法找到有关executor.submit()来电的未来状态的文档。

示例:

byte[] b = new byte[ 4000000 ];
new Random().nextBytes( b );
Callable<byte[]> c = new SorterCallable( b );
ExecutorService executor = Executors.newCachedThreadPool();
Future<byte[]> result = executor.submit( c );
boolean futureState = result.isDone();

问题是,在提交后立即调用Future<byte[]>时返回的isDone()对象是否返回false?

或者futureState true是否也可能boolean futureState = result.isDone();之前已执行提交的任务?

2 个答案:

答案 0 :(得分:4)

  

我想知道提交的行为是否为isDone()

构造了预定义为false的Future

只需查看答案来源。

FutureTask构造函数中,私有 字段state设置为NEWisDone()方法返回state != NEW。因此,在创建对象的那一刻,isDone()在理论上是错误的。

public FutureTask(Runnable runnable, V result) {
    this.callable = Executors.callable(runnable, result);
    this.state = NEW;       // ensure visibility of callable
}

public boolean isDone() {
    return state != NEW;
}

当然,如Alexey's answer中所述,如果任务在您提交的时间与您检查的时间之间执行,则您的futureState变量可能为真。

答案 1 :(得分:3)

回答问题

  

或者,futureState是否也可能是真的,以便在布尔futureState = result.isDone()之前执行提交的任务; ?

技术上是的,有可能。线程调度可能会使任务立即完成。但是,在大多数情况下,您将获得false IMO。