use*_*379 5 java parallel-processing multithreading callable
我想在一个单独的线程中执行不同的方法,具体取决于给构造函数的参数.但是,Callable接口只允许一种返回参数.
它应该像这样工作:
Future<String> result =
executor.submit(ClassThatImplementsCallable(RETURN_STRING));
Future<Integer> result =
executor.submit(ClassThatImplementsCallable(RETURN_INT));
ClassThatImplementsCallable(RETURN_NOTHING);
Run Code Online (Sandbox Code Playgroud)
要返回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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这不是我想要实现的,但是扩展Void并实现其他一些接口也没有意义.
我想在一个单独的线程中执行不同的方法,具体取决于给构造函数的参数.
所以,当你提交Callable给ExecutorService,你得到相同类型的未来:
Future<String> stringResult = executor.submit(new MyCallable<String>());
Future<Integer> stringResult = executor.submit(new MyCallable<Integer>());
Run Code Online (Sandbox Code Playgroud)
你不能做的是有一个Future result返回两种不同类型中的一种,String或者Integer,根据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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,你的执行将提交Callable<StringOrInteger>和的情况下,StringOrInteger通过返回的Future<StringOrInteger>意愿,无论是s或i字段将被设置.
一个非常难看的替代方案是返回Object并使用它instanceof来确定它是什么类型.但我甚至不会显示该实现的代码,因为它会给我荨麻疹.