多線程分段遍曆集合list(spring 線程池),listspring
基於Spring 的ThreadPoolTaskExecutor 線程池分段遍曆讀取集合list
代碼如下所示:
1、定義線程池
<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <!--初始線程池大小--> <property name="corePoolSize" value="10"/> <!--最大線程池大小--> <property name="maxPoolSize" value="30"/> </bean>
2、主線程代碼
@Autowired public ThreadPoolTaskExecutor threadPoolTaskExecutor; private void doReadList() throws InterruptedException, ExecutionException{ /**初始化集合**/ List<String> list = new ArrayList<String>(); for(int i=0;i<100;i++){ list.add("test--"+i); } /**接收集合各段的 執行的返回結果**/ List<Future<Boolean>> futureList = new ArrayList<Future<Boolean>>(); /**集合總條數**/ int size = list.size(); /**將集合切分的段數**/ int sunSum = 10; int listStart,listEnd; /***當總條數不足10條時 用總條數 當做線程切分值**/ if(sunSum > size){ sunSum = size; } /**定義子線程**/ SunCallable sunCallable ; /**將list 切分10份 多線程執行**/ for (int i = 0; i < sunSum; i++) { /***計算切割 開始和結束**/ listStart = size / sunSum * i ; listEnd = size / sunSum * ( i + 1 ); /**最後一段線程會 出現與其他線程不等的情況**/ if(i == sunSum - 1){ listEnd = size; } /**線程切斷**/ List<String> sunList = list.subList(listStart,listEnd); /**子線程初始化**/ sunCallable = new SunCallable(i,sunList); /***多線程執行***/ futureList.add(taskExecutor.submit(sunCallable)); } /**對各個線程段結果進行解析**/ for(Future<Boolean> future : futureList){ if(null != future && future.get()){ System.err.println("成功"); }else{ System.err.println("失敗"); } } }
3 子線程SunCallable代碼:
package xxx.xxx.xxx.xx; import java.util.List; import java.util.concurrent.Callable; public class SunCallable implements Callable<Boolean> { /**當前是屬於第幾段線程**/ private int pageIndex; private List<String> list; public SunCallable(int pageIndex,List<String> list){ this.pageIndex = pageIndex; this.list = list; } @Override public Boolean call() throws Exception { System.err.println(String.format("pageIndex:%s size:%s",pageIndex,list.size())); Boolean result = Boolean.TRUE; if(null != list && list.size() >0){ for(String str: list){ try { //TODO 業務處理 } catch (Exception e) { result = Boolean.FALSE;; } } } return result; } }