次の問題が発生します。パフォーマンス上の理由から、作業を複数のスレッドに分割する必要がありますが、どのようなアプローチを取るべきかわかりません。
まず、私が提供するタスクは、値を返し、パラメーターを受け取る必要があります。さらに、mainメソッド(ではなく、メインビットの作業をstatic main()
実行する)はすでに別のスレッドで実行されており、定期的に呼び出されます。また、このメソッドは、すべてのスレッドが終了して続行するまで、ある時点で待機する必要があります。
1つのアプローチ(私にとって最も明白な)は、各ジョブを別々のスレッドでスケジュールし、結果をクラス変数に格納することです。
public Object result1, result2;
public void mainMethod() throws InterruptedException {
final Thread thread = new Thread(new Runnable() {
@Override
public void run() {
result1 = expensiveMethod("param1");
}
});
final Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
result2 = expensiveMethod("param2");
}
});
thread1.join();
thread.join();
//Do rest of work
}
private Object expensiveMethod(Object param){
// Do work and return result
}
私が言ったように、mainMethodは何度も呼び出され、結果変数の設定に競合状態が必要ないため、これは少し醜く、理想的ではありません。理想的には、それらをローカル変数にしたいのですが、それらがfinalでない限り、runメソッド内からアクセス可能にすることはできず、値を割り当てることはできません...
私がやることについて私が考えたもう一つのアプローチはこれでした:
public void mainMethod() throws InterruptedException, ExecutionException {
String obj1, obj2;
final ExecutorService executorService = Executors.newFixedThreadPool(16);
final Future<String> res1 = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return expensiveMethod("param1");
}
});
final Future<String> res2 = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return expensiveMethod("param2");
}
});
obj1 = res1.get();
obj2 = res2.get();
}
private String expensiveMethod(String param) {
// Do work and return result
}
これにより、mainメソッドからのこれら2つの計算が自動的に待機され、結果をローカルに保存できます。皆さんはどう思いますか?他のアプローチはありますか?