JavaFX:使用执行器在线程池中 运行 时任务的可返回值
JavaFX: Returnable values of Tasks when ran in thread pool using Executor
我有一个Task
要执行,并提交到缓存线程池ExecutorService
。它 运行 顺利,但我需要能够检索它的可返回值。这怎么可能?
示例代码:
ExecutorService threadPool = Executors.newCachedThreadPool(runnableTask -> {
Thread thread = new Thread(runnableTask);
thread.setDaemon(true);
return thread;
});
Button btn = new Button("Run Task");
btn.setOnAction(actionEvent -> {
try {
Object get = threadPool.submit(new Task<String>() {
@Override
protected String call() throws Exception {
//simulating long-running task
Thread.sleep(3_000);
//return result
return "Warren Nocos";
}
}).get();
System.out.println(get);
} catch (InterruptedException | ExecutionException ex) {
logger.log(Level.SEVERE, ex.getMessage(), ex);
}
});
输出为空。
使用 onSucceeded()
回调(它将在 JavaFX 应用程序线程上执行):
Button btn = new Button("Run Task");
btn.setOnAction(actionEvent -> {
Task<String> task = new Task<String>() {
@Override
protected String call() throws Exception {
//simulating long-running task
Thread.sleep(3_000);
//return result
return "Warren Nocos";
}
};
task.setOnSucceeded(event -> {
String result = task.getValue();
System.out.println(result);
});
task.setOnFailed(event -> {
task.getException().printStackTrace();
});
threadPool.execute(task);
});
我有一个Task
要执行,并提交到缓存线程池ExecutorService
。它 运行 顺利,但我需要能够检索它的可返回值。这怎么可能?
示例代码:
ExecutorService threadPool = Executors.newCachedThreadPool(runnableTask -> {
Thread thread = new Thread(runnableTask);
thread.setDaemon(true);
return thread;
});
Button btn = new Button("Run Task");
btn.setOnAction(actionEvent -> {
try {
Object get = threadPool.submit(new Task<String>() {
@Override
protected String call() throws Exception {
//simulating long-running task
Thread.sleep(3_000);
//return result
return "Warren Nocos";
}
}).get();
System.out.println(get);
} catch (InterruptedException | ExecutionException ex) {
logger.log(Level.SEVERE, ex.getMessage(), ex);
}
});
输出为空。
使用 onSucceeded()
回调(它将在 JavaFX 应用程序线程上执行):
Button btn = new Button("Run Task");
btn.setOnAction(actionEvent -> {
Task<String> task = new Task<String>() {
@Override
protected String call() throws Exception {
//simulating long-running task
Thread.sleep(3_000);
//return result
return "Warren Nocos";
}
};
task.setOnSucceeded(event -> {
String result = task.getValue();
System.out.println(result);
});
task.setOnFailed(event -> {
task.getException().printStackTrace();
});
threadPool.execute(task);
});