在Callable和Future界面中使用泛型?

时间:2014-08-06 20:29:53

标签: java multithreading generics concurrency callable

Callable接口中泛型的用途是什么?

请考虑我从https://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6复制的代码:

import java.util.\*;
import java.util.concurrent.\*;

public class CallableExample {

  public static class WordLengthCallable
        implements Callable {
    private String word;
    public WordLengthCallable(String word) {
      this.word = word;
    }
    public Integer call() {
      return Integer.valueOf(word.length());
    }
  }

  public static void main(String args[]) throws Exception {
    ExecutorService pool = Executors.newFixedThreadPool(3);
    Set<Future<Integer>> set = new HashSet<Future<Integer>>();
    for (String word: args) {
      Callable<Integer> callable = new WordLengthCallable(word);
      Future<Integer> future = pool.submit(callable);
      set.add(future);
    }
    int sum = 0;
    for (Future<Integer> future : set) {
      sum += future.get();
    }
    System.out.printf("The sum of lengths is %s%n", sum);
    System.exit(sum);
  }
}

Callable<Integer>Future<Integer>中的整数未被使用。它可以是其他任何内容,例如Callable<String>Future<String>,代码仍可以使用。

我理解泛型的用法,并特别欣赏它在集合中的用法。

感谢。

2 个答案:

答案 0 :(得分:4)

Callable vs Runnable的要点是Callable返回值的能力(如果使用Future,则可通过ExecutorService检索)。他们可以将它编码为只返回Object并进行代码转换,但之后绝对没有编译时检查。似乎逻辑上使Callable通用以指定返回类型,因此您不需要显式转换并且您有编译时检查。

当然,由于类型擦除,这一切都会在运行时消失,但这并不会降低其WRT意图和编译时的值。

答案 1 :(得分:2)

约翰得到了正确答案。只是添加不重要性 忽略编译器警告。在编译当前代码时,编译器会警告您unchecked conversion

$ javac -Xlint:unchecked CallableExample.java
CallableExample.java:22: warning: [unchecked] unchecked conversion
found   : CallableExample.WordLengthCallable
required: java.util.concurrent.Callable<java.lang.Integer>
            Callable<Integer> callable = new WordLengthCallable(word);
                                         ^
1 warning
  

Callable<Integer>Future<Integer&gt;中的整数没有被使用。它   可能是其他任何东西,如Callable<String>和   Future<String>并且代码仍然可以使用。

将您的班级更改为使用implements Callable<Integer>

如果您开始在任何地方使用Callable<String>Future<String>,编译器会感到满意并且您的代码将无效。