java - 为 ExecutorService invokeAll() 创建包装器

标签 java

我正在处理这段代码示例:

ExecutorService executorService = Executors.newSingleThreadExecutor();

Set<Callable<String>> callables = new HashSet<Callable<String>>();

callables.add(new Callable<String>() {
    public String call() throws Exception {
        return "Task 1";
    }
});
callables.add(new Callable<String>() {
    public String call() throws Exception {
        return "Task 2";
    }
});
callables.add(new Callable<String>() {
    public String call() throws Exception {
        return "Task 3";
    }
});

List<Future<String>> futures = executorService.invokeAll(callables);

for(Future<String> future : futures){
    System.out.println("future.get = " + future.get());
}

executorService.shutdown();

我正在尝试为这段代码编写一个包装类,它将适用于泛型类型,并且在展开时可以转换为 String/int/etc。

我遇到的问题是将集合传递给 invokeAll() 方法。我在将自定义 Activity 添加到可调用集时遇到了一些问题。

理想情况下,我希望能够分离出我的代码,这样我就可以调用方法而不是声明一个内部类。有没有一种方法可以声明从我的自定义方法返回的对象集合,这些对象可以传递给 invokeAll() 方法?

我正在尝试几个不同的集合,但不断得到:

The method invokeAll(Collection<? extends Callable<T>>) in the type ExecutorService is not applicable for the arguments (Collection<Object>)

最佳答案

因为 invokeAll()Generic Method ,您可能需要使用特殊语法来指示它们的 T 类型。以下调用应清除您的错误:

List<Future<String>> futures = executorService.<String>invokeAll(callables);

尽管我不得不说,我能够在独立程序中按原样运行您的示例代码...

通常,这不是问题,但如果使用类型推断(从 Java 7 开始可用)定义集合,则可能会成为问题。例如,如果您以以下方式初始化您的 Collection:

Set<Callable<String>> callables = new HashSet<>();

这意味着编译器可能需要更加努力地确定您的集合的类型(尽管这对我来说也很管用)。这在您的情况下可能尤其如此,因为您声称您正在尝试编写通用包装类。泛型方法的狡猾几乎肯定在起作用。您可能还想查看 this关于泛型方法的 Java 教程。

关于java - 为 ExecutorService invokeAll() 创建包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22923273/

相关文章:

java - 无法解析 mojo org.apache.maven.plugins :maven-assembly-plugin:3. 1.1 的配置

java - 用于 Java EE 的 Eclipse Juno 仅在一个 Java SE 类上没有 "Run as Java Application"

java - 从 MySQL 触发器获取错误 “Data truncation: Data too long for column ' USER'”

Java子串难度

java - GWT 序列化扩展 TreeSet 的类

java - 使用 Apache Axis2 1.7.8 生成 Web 服务客户端

java - 带有 Jersey 的 Web 服务仅返回 404

java - PostgreSQL 中 Long 数据类型的等价物是什么?

java - 对称映射数据结构

java - maven-tomcat 插件部署在远程服务器上