FX Task, returning a value always returns null

二次信任 提交于 2019-12-11 20:27:43

问题


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)



来源:https://stackoverflow.com/questions/29985455/fx-task-returning-a-value-always-returns-null

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!