FX Task, returning a value always returns null

2019-09-08 08:14发布

问题:

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;
}}

回答1:

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, Runnables 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);
}


回答2:

From the submit Javadoc:

The Future's get method will return null upon successful completion.

(Emphasis mine)



标签: java javafx task