DealListWithMutiThreadsUtils
package com.rookey.jflow.utils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.function.Function;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
* 数组拆分多个线程并发处理类
* @author Administrator
*
*/
public class DealListWithMutiThreadsUtils {
/**
* 并发处理数
*/
private static Integer maxThreads = 40;
/**
* 数组拆分多个线程并发处理
* @param list 数组
* @param callbackFunc 回调函数
* @return
*/
public JSONArray dealList(JSONArray list, Function<JSONObject, JSONArray> callbackFunc){
JSONArray result = new JSONArray();
//分割的数量
int dealSize = list.size() <= maxThreads ? 1 : (int) Math.ceil(list.size() * 1.0d / maxThreads);
int threadNum = (int) Math.ceil(list.size() * 1.0d / dealSize);
int index = 0;
ExecutorService ex = Executors.newFixedThreadPool(threadNum);
List<Future<JSONArray>> futures = new ArrayList<>(threadNum);
// 分配
for (int i = 0; i <= threadNum; i++, index += dealSize) {
int start = index;
if (start >= list.size())
break;
int end = start + dealSize;
end = end > list.size() ? list.size() : end;
futures.add(ex.submit(new Task(list, start, end, callbackFunc)));
}
try {
// 处理
for (Future<JSONArray> future : futures) {
// 合并操作
result.addAll(future.get());
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 并行处理任务类
* @author wdx
*
*/
private class Task implements Callable<JSONArray>{
private JSONArray list;
private int start;
private int end;
private Function<JSONObject, JSONArray> callbackFunc;
public Task(JSONArray list, int start, int end, Function<JSONObject, JSONArray> callbackFunc) {
this.list = list;
this.start = start;
this.end = end;
this.callbackFunc = callbackFunc;
}
@Override
public JSONArray call() throws Exception {
JSONArray resultList = new JSONArray();
for (int i = start; i < end; i++) {
JSONObject obj = list.getJSONObject(i);
// 处理逻辑
JSONArray arr = this.callbackFunc.apply(obj);
if(null != arr && arr.size() > 0) {
resultList.addAll(arr);
}
}
// 返回处理结果
return resultList;
}
}
}
浙公网安备 33010602011771号