ExecutorServiceとFuturesのリストを使用してJavaでスレッドプールを作成しました。 私は、Callableインターフェイスを実装するRandomProcessクラスを作成し、呼び出しメソッド をオーバーライドして特定の操作を実行しました。実行時にExecutorService経由でスレッドに加えられた変更が反映されない
それは次のようになります。
public class RandomProcess implements Callable<Integer> {
private Result result;
public RandomProcess(Result result) {
super();
this.result = result;
}
@Override
public Integer call() throws Exception {
//performSomeOps returns a Result that has certain values that I need
result = performSomeOps();
return 1;
}
私はRandomprocessスレッドで を加えられた変更を反映することになって、このクラスでは、この結果オブジェクトを持っています。残念ながら、私はこの結果を返すとき、変更は反映されません。
public class Abc{
public Result check(){
Result result = new Result(true);
try {
ExecutorService exec = Executors.newFixedThreadPool(7);
List<Future<?>> futures = new ArrayList<Future<?>>(7);
for (Entity entity : randomListOfEntities) {
futures.add(exec.submit(new RandomProcess(result)));
}
for (Future<?> f : futures) {
f.get(); // wait for a process to complete
}
exec.shutdown();
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
問題の原因を特定できません。
なぜそれが何かを反映する必要がありますか?何も追加/変更していない 'result'への内部参照のみをオーバーライドしています。 –
こんにちは@M.Deinumあなたはどのように結果で行われた変更を取り戻すことができますので、私はそれらをチェックメソッドに持っていますか教えてください。 Thnx –
**いつも1を返す代わりに**結果を返すのはどうですか? f.get()はこの結果も返します。 –