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); }