I have a service like:
class DemoService { Result process(Input in) { filter1(in); if (filter2(in)) return... filter3(in); filter4(in); filter5(in); return ... } }
Now I want it faster, and I found that some filters can run at the same time, while some filters must wait for others to complete. For example:
filter1-- |---filter3-- filter2-- |---filter5 ---filter4--
which means:
1.filter1 and filter2 can be run simultaneously, so filter3 and filter4
2.filter3 and filter4 must wait for filter2 to complete.
one more thing :
if filter2 returns true, then the process method returns immediately and ignores the following filters.
now my solution uses FutureTask:
// do filter 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; } } }
my 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) {
I want to know:
1. Is it a good idea to use FutureTask in this case? is there a better solution?
2. Overhead on the context of the flow context.
thanks!
java multithreading concurrency futuretask
bylijinnan
source share