Future<List<Map<String, Object>>> f = pool.submit(IPThread, userinput); int j = 0; for (int i = 0; i < flist.size(); i++) {//等待全部提交线程结束 Future<List<Map<String, Object>>> f = flist.get(i); try{ List<Map<String, Object>> result=f.get();//等待线程执行完成,没有设置超时。一直等待任务完成。 if (result!=null||result.size()!=0) { j++; } } catch (InterruptedException e) { f.cancel(true); } catch (ExecutionException e) { f.cancel(true); } }
项目中遇到一个棘手的问题,就是多线程处理一些结果。可是最后要得到每一个线程运行的结果汇总。java
思路是这样子的,有一个主线程用来调用这些子线程。每一个线程提交后,都会向static 安全
List<List<Map<String, Object>>> result 变量添加运行结果,由于只是添加因此不涉及到线程安全问题。这样就能够完美解决了。固然要注意要每次请求都要新生成新实例,要否则,可能result会存在线程安全问题,经过设置scope为request解决。多线程
<jsp:useBean id="resultBean" class="com.**" scope="request" />
pool.submit(IPThread, userinput); 这个家伙有点奇怪,若是线程代码里面出现必定的状况是能够将线程的运行结果返回到userinput里面的,以前试了一下是当userinput是hashmap类型的时候能够。可是查询API解释说不能够返回的啊,实在是很奇怪。jsp
###线程代码 @Override public void run() { Map<String, Object> map = queryIP(); if (map != null && map.size() > 0) result.putAll(map); }