可以使用不同的返回类型调用

时间:2013-06-03 20:51:06

标签: java multithreading parallel-processing callable

我想在一个单独的线程中执行不同的方法,具体取决于给构造函数的参数。但是,Callable接口只允许一种返回参数。

它应该像这样工作:

Future<String> result =
       executor.submit(ClassThatImplementsCallable(RETURN_STRING));
Future<Integer> result =
       executor.submit(ClassThatImplementsCallable(RETURN_INT));

ClassThatImplementsCallable(RETURN_NOTHING);

要返回null(分别是对Void的引用)或任何其他类型(如String或Integer),我必须使用T而没有任何像这样的边界:

public static class CallableTest<T> implements Callable<T>{
    T value;
    CallableTest(T value) {
       this.value = value;
    }
    public T call(){    
       return value;   
    }    
}

然而,这不是我想要实现的,但是扩展Void并实现其他接口也没有意义。

2 个答案:

答案 0 :(得分:8)

  

我想在一个单独的线程中执行不同的方法,具体取决于给构造函数的参数。

因此,当您向Callable提交ExecutorService时,您将获得具有相同类型的未来:

Future<String> stringResult = executor.submit(new MyCallable<String>());
Future<Integer> stringResult = executor.submit(new MyCallable<Integer>());

无法做的事情是有一个Future result根据参数返回两种不同类型中的一种,StringInteger ExecutorService已经建成。我想这就是你要问的。

另一种方法是创建一个小包装类:

public class StringOrInteger {
    final String s;
    final Integer i;
    public StringOrInteger(String s) {
        this.s = s;
        this.i = null;
    }
    public StringOrInteger(Integer i) {
        this.s = null;
        this.i = i;
    }
    public boolean isString() {
        return this.s != null;
    }
}

然后,您的遗嘱执行人将提交Callable<StringOrInteger>,而StringOrInteger返回的Future<StringOrInteger>个例将会设置si字段。< / p>

非常难看的替代方法是返回Object并使用instanceof来确定它是什么类型。但我甚至不会显示该实现的代码,因为它会给我荨麻疹。

答案 1 :(得分:1)

您可以将命令模式与访客模式一起使用。

定义一个命令类,并将处理逻辑与参数和返回类型一起包装在一起。然后将此命令对象作为参数传递,并将其用作结果类型。

稍后在您的代码中,您可以使用访问者模式来处理两个具体的命令。