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
。一般来说,当然,Runnable
s 没有 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);
}
我正在尝试 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 returnnull
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
。一般来说,当然,Runnable
s 没有 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);
}