I am trying to return a String from a FX Task.
Expected output: true,testABC.
Real output: true,null.
The call to the task:
public static void main(String[] args) {
ExecutorService pool = Executors.newCachedThreadPool();
Future<String> my_String = (Future<String>) pool.submit(new my_task());
try {
Thread.sleep(500);
System.out.println(my_String.isDone());
System.out.println(my_String.get());//gettings the String from the future
} catch (InterruptedException | ExecutionException ex) {
Logger.getLogger(Return_test.class.getName()).log(Level.SEVERE, null, ex);
}}
The task:
public class my_task extends Task<String>{
@Override
protected String call() throws Exception {
String tempString = "testABC";
return tempString;
}}
Task
implements Runnable
, but not Callable
. So when you call pool.submit(myTask)
, you are calling the overloaded form of ExecutorService.submit(...)
taking a Runnable
. In general, of course, Runnable
s do not return values, so the Future
that is returned from that version of submit(...)
, as Aerus has already pointed out, just returns null
from its get()
method (it cannot get a value from the Runnable
).
However, Task
also extends FutureTask
directly, so you can use your task directly to get the result. Just do
Task<String> myTask = new my_task(); // Please use standard naming conventions, i.e. new MyTask();
pool.submit(myTask);
try {
// sleep is unnecessary, get() will block until ready anyway
System.out.println(myTask.get());
} catch (InterruptedException | ExecutionException ex) {
Logger.getLogger(Return_test.class.getName()).log(Level.SEVERE, null, ex);
}
From the submit
Javadoc:
The Future's get
method will return null
upon successful completion.
(Emphasis mine)