spring多執行緒返回值 並對多個返回值進行操作
阿新 • • 發佈:2019-02-16
最近遇到一個問題:有一大堆的債券,需要根據不同類別的標籤進行篩選出需要的債券,並且還要根據條件對這些標籤分別進行並和或操作。
最終決定使用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; } } }