Мгновенно ли Future возвращает false для isDone() сразу после того, как исполнитель submit()
Не удалось найти документацию о будущем состоянии 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()
сразу после отправки?
Или также возможно, что futureState
является true
таким образом, что представленное задание было выполнено ранее boolean futureState = result.isDone();
?
2 ответа
Мне интересно, если сам акт отправки конструирует Future с предопределенным false для isDone()
Просто проверьте источник ответа.
в FutureTask
конструктор, приватное поле state
установлен в NEW
, isDone()
метод возвращает 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;
}
Конечно, как описано в ответе Алексея, ваш futureState
Переменная может иметь значение true, если задача была выполнена между временем, когда вы ее отправили, и временем, которое вы проверили.
Отвечая на вопрос
Или также возможно, что futureState имеет значение true, так что переданная задача была выполнена до логического значения futureState = result.isDone();?
Технически да, это возможно. Планирование потоков может происходить таким образом, что задача будет выполнена сразу. Но в большинстве случаев вы получите false
ИМО.