我正在尝试从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;
}}
答案 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
。
(强调我的)