FX 任务,返回值总是 returns null

FX Task, returning a value always returns null

我正在尝试 return 来自 FX 任务的字符串。

预期输出:true,testABC。

实际输出:true,null。

任务调用:

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

任务:

public class my_task extends Task<String>{

@Override
protected String call() throws Exception {
    String tempString = "testABC";
    return tempString;
}}

来自 submit Javadoc:

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

(强调我的)

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。一般来说,当然,Runnables 没有 return 值,所以 Future 是 return 从那个版本的 submit(...) 编辑的,因为 Aerus 已经指出,只是 returns null 来自其 get() 方法(它无法从 Runnable 获取值)。

然而,Task 也直接扩展了 FutureTask,因此您可以直接使用您的任务来获取结果。就这样

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