1. 程式人生 > >spring多執行緒返回值 並對多個返回值進行操作

spring多執行緒返回值 並對多個返回值進行操作

最近遇到一個問題:有一大堆的債券,需要根據不同類別的標籤進行篩選出需要的債券,並且還要根據條件對這些標籤分別進行並和或操作。

最終決定使用callable+future來實現:

具體程式碼如下:

@RequestMapping("/test")
public Object test(HttpServletRequest request){
	try{
		//建立一個執行緒池
		ExecutorService pool = Executors.newFixedThreadPool(2);
		//建立多個有返回值的任務
		List<Future<List<String>>> list = new ArrayList<>();
		
		Callable<List<String>> c1 = myCallable01();
		//執行任務並獲取Future物件
		Future<List<String>> f1 = pool.submit(c1);
		list.add(f1);
		
		Callable<List<String>> c2 = myCallable02();
		//執行任務並獲取Future物件
		Future<List<String>> f2 = pool.submit(c2);
		list.add(f2);
		
		//關閉執行緒池
		pool.shutdown();
		
		List<String> list1 = list.get(0).get();
		List<String> list2 = list.get(1).get();
		
		//取並集
		list2.removeAll(list1);
		list1.addAll(list2);
		
	}catch{
		
	}
	
	return "";
	
}


public Callable<List<String>> myCallable01(){
	
	return new Callable<List<String>>(){
		@Override
		public List<String> call() throws Exception{
			Thread.sleep(6000);
			List<String> list = new ArrayList<>();
			list.add("aaa");
			list.add("bbb");
			list.add("ccc");
			return list;
		}
	}
}

public Callable<List<String>> myCallable02(){
	
	return new Callable<List<String>>(){
		@Override
		public List<String> call() throws Exception{
			Thread.sleep(9000);
			List<String> list = new ArrayList<>();
			list.add("ccc");
			list.add("ddd");
			list.add("eee");
			return list;
		}
	}
}