我有这样的服务:
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完成
还有一件事:
如果 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;
}
}
}
我的可调用过滤器:
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.线程上下文切换的开销。
谢谢!