私はいくつかのタスクをマルチスレッドで行う必要があります。
私はすべてのタスクが完了したら私のプログラムを続けることを前もって知っています。
この目的には次のコードが適していますか?コールウェイと先物マルチスレッドを適切な方法で使用していますか(java)?
public void test() {
Callable<String> myCall = new Callable() {
@Override
public String call() throws Exception {
return doDomething();
}
};
Callable<String> myCall2 = new Callable() {
@Override
public String call() throws Exception {
return doDomething2();
}
};
ExecutorService executor = Executors.newFixedThreadPool(2);
List<Callable<String>> list = Arrays.asList(myCall,myCall2);
List<Future<String>> futuresList = executor.invokeAll(list);
String result1 = futuresList.get(0).get();
String result2 = futuresList.get(0).get();
//...
}
私はジェネリックで動作するようにこれを変更しようとしています:
public void test() {
Callable<?> myCall = new Callable() {
@Override
public String call() throws Exception {
return doDomething();
}
};
Callable<?> myCall2 = new Callable() {
@Override
public String call() throws Exception {
return doDomething2();
}
};
ExecutorService executor = Executors.newFixedThreadPool(2);
List<Callable<?>> list = Arrays.asList(myCall,myCall2);
List<Future<?>> futuresList = executor.invokeAll((Collection<? extends Callable<?>>)list);
String result1 = futuresList.get(0).get();
String result2 = futuresList.get(0).get();
// ...
}
は、私は次のコンパイルエラーが表示されます。
The method
invokeAll(Collection<? extends Callable<T>>)
in the type ExecutorService is not applicable for the arguments(Collection<capture#2-of ? extends Callable<?>>)
.
大丈夫ですが、そのコードの実行に問題はありますか? –
いいえ、同じことをする別の実装があるのだろうかと思っていました。たとえば、実行者サービスを使用せずにこれを実装できますか? – AAaa
なぜあなたは 'ExecutorService'を使わずにそれをしたいのですか?生の 'Thread'sであなたが望むものを達成することができますが、executorフレームワークが存在するので、複雑さに対処する必要はありません。 – ColinD