1,定义线程对象
class CancelApprovalCallable implements Callable<JSONbject>{ private String id; private String domain; CancelApprovalCallable(String id,String domain){ this.id=id; this.domain = domain; } /* (non-Javadoc) * @see java.util.concurrent.Callable#call() */ @Override public JSObject call() throws Exception { return null; } }
2,使用线程池执行多线程
ExecutorService executorService = Executors.newFixedThreadPool(5); List<CancelApprovalCallable> callables = new List<>(); for(int i=0,len=idsArray.size();i<len;i++){ String id = idsArray.get(i); CancelApprovalCallable callable = new CancelApprovalCallable(id,domain); callables.add(callable); } List<Future<JSONObject>> resultList = new ArrayList<>(); try{ resultList = executorService.invokeAll(callables);//ExecutorService.invokeAll(Collection<Callable> tasks)能够批量提交任务,但是该方法只有在tasks全部执行完毕才返回包含各个任务对应的Future实例的列表。因此invokeAll方法批量提交任务的时候,任务等待返回结果的时间取决于这批任务中最耗时的任务。 }catch(InterruptedException e){ log.error("execute concurrent thread error",e); }finally{ if(!executorService.isShutdown() || !executorService.isTerminated()){ executorService.shutdown(); } }
ExecutorCompletionService中使用take()可以先获取任务已经执行完成的结果,而不需要等待所有任务执行完毕,但是假如没有一个任务执行完成也会阻塞获取结果。
3,获取执行结果
/** *批量获取线程执行结果,循环处理每条结果数据 */ for(Future<JSONObject> future : resultList){ JSONObject resp2 = null; try{ resp2 = future.get();//假如任务未完成,会阻塞获取结果 }catch(Exception e){ log.error("execute concurrent thread error",e); } if(resp2 == null){ continue; } }