Когда вы отправляете FutureTask
в ExecutorService
, он обрабатывается как Runnable
, поэтому Future
, полученный из метода submit
, будет иметь значение null
в качестве Runnable
экземпляров. не возвращать никакого результата.
Поскольку FutureTask
реализует интерфейс Runnable
, этот метод ExecutorService
называется submit(Runnable task)
, поэтому Runnable
, который вы заключаете в конструкторе FutureTask
, фактически передается в ExecutorService
и, следовательно, вы получаете ноль при вызове f2.get()
.
Но когда вы вызываете get()
по ссылке FutureTask
, вы получаете обратно значение, которое вы указали в качестве второго параметра, когда Runnable
завершил его выполнение (когда вы отправили задание ранее в ExecutorService
).
Вы также можете проверить это с помощью , не передавая futureTask
в ExecutorService
, тогда, если вы попытаетесь вызвать get для переменной futureTask
, вызов get
будет блокироваться бесконечно, так как Runnable
не было выполнено.
// Returning "JOHN" when the supplied Runnable is completed execution.
System.out.println("FutureTask Reference Object: "+futureTask.isDone()+" "+futureTask.get());
Это согласно документам :
Создает задание FutureTask, которое при запуске выполнит заданное
Runnable, и организовать, что get вернет данный результат на
успешное завершение.