次のようなサービスがあります。
class DemoService {
Result process(Input in) {
filter1(in);
if (filter2(in)) return...
filter3(in);
filter4(in);
filter5(in);
return ...
}
}
今はもっと速くしたいのですが、同時に開始できるフィルターもあれば、他のフィルターが終了するのを待たなければならないフィルターもあることがわかりました。例えば:
filter1--
|---filter3--
filter2-- |---filter5
---filter4--
つまり:
1.filter1 と filter2 は同時に開始でき、filter3 と filter4 も同時に開始できます。
2.filter3 と filter4 は、filter2 が終了するまで待機する必要があります
もう1つ:
filter2 が true を返す場合、'process' メソッドはすぐに戻り、次のフィルターを無視します。
今私のソリューションは FutureTask を使用しています:
// do filter's work at FutureTask
for (Filter filter : filters) {
FutureTask<RiskResult> futureTask = new FutureTask<RiskResult>(new CallableFilter(filter, context));
executorService.execute(futureTask);
}
//when all FutureTask are submitted, wait for result
for(Filter filter : filters) {
if (filter.isReturnNeeded()) {
FutureTask<RiskResult> futureTask = context.getTask(filter.getId());
riskResult = futureTask.get();
if (canReturn(filter, riskResult)) {
returnOk = true;
return riskResult;
}
}
}
私の CallableFilter:
public class CallableFilter implements Callable<RiskResult> {
private Filter filter;
private Context context;
@Override
public RiskResult call() throws Exception {
List<Filter> dependencies = filter.getDependentFilters();
if (dependencies != null && dependencies.size() > 0) {
//wait for its dependency filters to finish
for (Filter d : dependencies) {
FutureTask<RiskResult> futureTask = context.getTask(d.getId());
futureTask.get();
}
}
//do its own work
return filter.execute(context);
}
}
私は知りたいです:
1.この場合、FutureTask を使用することをお勧めしますか? より良い解決策はありますか?
2.スレッドコンテキストスイッチのオーバーヘッド。
ありがとう!