FX Task,返回一个值总是返回null

时间:2015-05-01 10:41:10

标签: java javafx task

我正在尝试从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;
}}

2 个答案:

答案 0 :(得分:4)

Task实施Runnable,但不是Callable。因此,当您拨打pool.submit(myTask)时,您正在呼叫overloaded form of ExecutorService.submit(...) taking a Runnable。当然,一般来说,Runnable s不会返回值,因此从Aerus已经指出的那个版本的Future返回的submit(...)只会返回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);
}

答案 1 :(得分:1)

来自submit Javadoc:

  

未来的get方法会在成功完成后返回null

(强调我的)