gpt4 book ai didi

java - 使用并发包中的同步器。 FutureTask 总是返回 null

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:31:44 24 4
gpt4 key购买 nike

谁能说出为什么在下面的代码片段中使用 FutureTask 不起作用?
我的理解是我们可以使用FutureTask,对吧?
给出完整的描述:
我在我的代码中偶然发现了一些细微的错误。
简而言之,我创建了一个类,它使用 SingleThreadPoolExecutor 来运行作为参数传递的 Callable
我使用它来运行后台任务并在 Eclipse 应用程序中显示进度对话框。
代码是:

public class TaskRunner <T>  {  

final static ExecutorService threadPool = Executors.newSingleThreadExecutor();
private T taskResult;

public T runTask(Callable<T> task, Shell currentShell) throws CustomException{
if(currentShell == null){
currentShell = new Shell();
}
final Callable<T> taskToRun = task;

ProgressMonitorDialog progressDialog = new ProgressMonitorDialog(currentShell);
try {
progressDialog.run(false, true, new IRunnableWithProgress() {

@SuppressWarnings("unchecked")
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
monitor.beginTask("Saving your data!", 100);

FutureTask<T> task = createTask(taskToRun);
Future<?> result = threadPool.submit(task);
while(!result.isDone()){
monitor.worked(1);
}
try {
taskResult = (T) result.get();
if(taskResult == null){
System.out.println("Result here in return is NULL!");
}

} catch (ExecutionException e1) {
logger.error(e1);
}
catch(Exception e){
logger.error(e);
}
}
});
} catch (InvocationTargetException e) {
logger.error(e);
} catch (InterruptedException e) {
logger.error(e);
}
return taskResult;
}

private static <T> FutureTask<T> createTask(Callable<T> theTask){
return new FutureTask<T>(theTask);
}
}

和代码任务:

public class MyTask implements Callable<ComplexObject> {    

private Util helper;
private String filePath;

public LoadKeystoreTask(Util helper, String filePath) {
this.helper = helper;
this.filePath = filePath;
}

@Override
public Container call() throws Exception {
ComplexObject result = helper.loadData(filePath);
if(result == null){
System.out.println("ComplexObject IS NULL!");
}
else{
System.out.println("ComplexObject IS NOT NULL!");
}
return result;
}
}

问题:
虽然 helper.loadData 正确返回结果(通过调试和打印语句验证)这一行:

taskResult = (T) result.get(); 

总是null
即为了简化它被打印:

ComplexObject IS NOT NULL!
Result here in return is NULL!

经验证是提交FutureTask引起的。
如果我改为提交 Callable:

即只需更改为:

Future<?> result = threadPool.submit(taskToRun);

有效!为什么用 FutureTask 包装会导致这个问题?

最佳答案

FutureTask在这里是不必要的:

private static <T> FutureTask<T> createTask(Callable<T> theTask){  
return new FutureTask<T>(theTask);
}

FutureTask<T> task = createTask(taskToRun);
Future<?> result = threadPool.submit(task);

只是submit() Calleble<T>直接:

Future<?> result = threadPool.submit(taskToRun); 

我不认为 FutureTask 用于用户代码:

This class provides a base implementation of Future

离开实现Future到图书馆。

关于java - 使用并发包中的同步器。 FutureTask 总是返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13103939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com