gpt4 book ai didi

java - Future 与 Java Executor Service 中扩展 Task 的类不兼容

转载 作者:行者123 更新时间:2023-11-30 06:27:08 26 4
gpt4 key购买 nike

我的类(class)DownloadTask延伸javafx.concurrent.Task<Boolean>

将我的任务提交给 ExecutorService 后,我尝试将结果分配给 Future<Boolean> 类型的变量。但是,IDE 警告我,我的实例化对象具有泛型类型 <capture<?>>我不知道为什么。

我的类(class)DownloadTask :

import javafx.concurrent.Task;

private class DownloadTask extends Task<Boolean>{
public DownloadTask() {}

@Override
protected Boolean call() throws Exception {
return true;
}
}

我如何管理线程池:

ExecutorService executor = Executors.newFixedThreadPool(10);
ArrayList<Future<Boolean>> resultList = new ArrayList<>();

for (ScheduleRow scheduleRow : queArray) {
DownloadTask downloadTask = new DownloadTask();

Future<Boolean> result = executor.submit(downloadTask); //incompatible types

resultList.add(result);
}

executor.shutdown();

最佳答案

简短回答

要解决该警告,您可以只需添加类型信息即可启用类型推断:

Future<Boolean> result = executor.submit(downloadTask, true);

但是请注意,对于 result变量,Futureget成功完成后,方法将返回给定的 true,因为 DownloadTask被解释为 Runnable这不会产生结果。正如 Mike Strobel 所说,更好的方法是从 DownloadTask 获得正确的结果。本身,因为它也是一个 Future<Boolean> :

executor.submit(downloadTask);
resultList.add(downloadTask);

长答案

正如 Andy Turner 所说,javafx.concurrent.Task 的继承类型是 Runnable (因为它扩展了 FutureTask 实现 RunnableFuture )。

将此传递给 Future<?> submit(Runnable task) ExecutorService的方法将产生 Future<?>结果,IDE 将抛出令人讨厌的 Future<capture<?>> .

但是,您不需要特定于 javafx 的 ExecutorServicejava.util.concurrent.ExecutorService工作正常,因为 DownloadTaskFutureTask 的子类.

要修复类型推断,您可以使用泛型 <T> Future<T> submit(Runnable task, T result) java.util.concurrent.ExecutorService的方法。由于它是一个简单的 boolean 值,因此您可以依赖自动装箱:

Future<Boolean> result = executor.submit(downloadTask, true);

问题是,对于 result变量,Future的 get 方法将在成功完成后返回给定的 true。在您的示例中,get方法对结果 Future总是会返回null 。那是因为它被解释为 Runnable这不会产生结果。正如 Mike Strobel 所说,更好的方法是从 DownloadTask 本身获取正确的结果,因为它也是一个 Future:

executor.submit(downloadTask);
resultList.add(downloadTask);

关于java - Future<T> 与 Java Executor Service 中扩展 Task<T> 的类不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46961479/

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