有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为ExecutorService invokeAll()创建包装器

我正在使用此代码示例:

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()方法。将自定义活动添加到callables集合时遇到问题

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

我正在尝试一些不同的系列,但不断得到:

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

共 (1) 个答案

  1. # 1 楼答案

    因为^{}Generic Method,所以可能需要使用特殊语法来指示T的类型。下面的调用将清除您的错误:

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

    虽然我不得不说,我能够像在独立程序中一样运行您的示例代码

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

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

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