package gms.Panorama.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
/**
* 多線程處理list集合
*
*/
public class ThreadsTestAA {
/**
* 使用多線程處理數據
* @param list
* @param nThreads
* @throws Exception
*/
public static void processList2(List<Object> list,final int nThreads) throws Exception {
// 存最后的結果
StringBuffer ret = new StringBuffer();
if (list == null || list.isEmpty()) {
//這里可以根據自己的業務需要去做處理
System.out.println("要處理的數據為空");
}
ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
List<Future<Object>> futures = new ArrayList<Future<Object>>(nThreads);
/**集合總條數**/
int size = list.size();
/**將集合切分的段數**/
int listStart,listEnd;
//根據線程 進行數據的拆分
for (int i = 0; i < nThreads; i++) {
/***計算切割 開始和結束**/
listStart = size / nThreads * i ;
listEnd = size / nThreads * ( i + 1 );
/**最后一段線程會 出現與其他線程不等的情況**/
if(i == nThreads - 1){
listEnd = size;
}
final List<Object> subList = list.subList(listStart, listEnd);
Callable<Object> task = new Callable<Object>() {
@Override
public Object call() throws Exception {
//存當前線程處理的數據,最后統一匯總打印
StringBuffer sb = new StringBuffer();
for (Object str : subList) {
sb.append(str+"\t");
}
return sb.toString();
}
};
futures.add(executorService.submit(task));
}
// 匯總處理的結果
for (Future<Object> future : futures) {
ret.append(future.get());
}
executorService.shutdown();
System.out.println("並發處理結果: "+ret.toString());
}
public static void main(String[] args) throws Exception{
List<Object> list = new ArrayList<>();
for(int i=0;i<4;i++){
list.add(String.valueOf(i));
}
processList2(list,5);
}
}
