7

我想根据提供给构造函数的参数在单独的线程中执行不同的方法。但是,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 并实现其他一些接口也没有任何意义。

4

2 回答 2

11

我想根据提供给构造函数的参数在单独的线程中执行不同的方法。

因此,当您将 a 提交Callable给 an时ExecutorService,您将获得具有相同类型的 future:

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;
    }
}

然后您的执行者将提交,并且将设置or字段返回Callable<StringOrInteger>的实例。StringOrIntegerFuture<StringOrInteger>si

一个极其丑陋的替代方法是返回Object并使用instanceof它来确定它是什么类型。但我什至不会显示该实现的代码,因为它会让我感到烦恼。

于 2013-06-03T20:53:16.937 回答
1

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

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

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

于 2013-06-03T21:10:27.597 回答