多線程ThreadPoolExecutor的submit多線程處理一些結果彙總

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) 介紹一下

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);
}
相關文章
相關標籤/搜索