Мгновенно ли 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 ИМО.

Другие вопросы по тегам