<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
package com.htf.utils;
import com.alibaba.fastjson.JSONArray;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.*;
/**
* @Auther: admin
* @Date: 2019/8/8 21:48
* @Description:
*/
public class Multithreading {
public static void test() {
/* List dataList = parseExcel(new File(filePath), EventDataInfo.PARSER_START_ROW_NUM, 1, -1, -1)
int size = dataList.size();
// 啓動線程數,默認爲10
int nThreads = EventDataInfo.DEFAULT_THREADS_NUM;
if (size < 10) {
nThreads = size;
}
String checkResult = "";
if (size > 100) {
checkResult = analyseExcel(dataArray, nThreads, baseParam);
} else {
checkResult = syncAnalyseExcel(dataArray, nThreads, baseParam);
}*/
}
protected String analyseExcel(final JSONArray dataArray, final int nThreads, final HashMap param) throws InterruptedException, ExecutionException {
new Thread() {
@Override
public void run() {
try {
StringBuffer ret = new StringBuffer();
int size = dataArray.size();
int num = nThreads;
if (size % nThreads != 0) {
num = nThreads + 1;
}
// 多線程池
ExecutorService executorService = Executors.newFixedThreadPool(num);
// 設置基本參數
final HashMap paramMap = param;
List<Future> futures = new ArrayList(num);
for (int i = 0; i < nThreads; i++) {
// 根據文件大小和線程數獲取子列表
final List subList = dataArray.subList(size / nThreads * i, size / nThreads * (i + 1));
Callable task = new Callable() {
@Override
public String call() throws Exception {
StringBuffer sb = new StringBuffer();
for (Object obj : subList) {
// 執行解析操作,返回驗證結果
//logger.info("======current Thread:{}", Thread.currentThread().getName());
//sb.append(executeAnalyse(JSONObject.parseObject(obj.toString()), paramMap));
}
return sb.toString();
}
};
futures.add(executorService.submit(task));
}
if (size % nThreads != 0) {
final List subList2 = dataArray.subList(size - (size % nThreads), size);
futures.add(executorService.submit(new Callable() {
@Override
public String call() throws Exception {
StringBuffer sb = new StringBuffer();
for (Object obj : subList2) {
// 執行解析操作,返回驗證結果
// logger.info("======current Thread:{}", Thread.currentThread().getName());
//sb.append(executeAnalyse(JSONObject.parseObject(obj.toString()), paramMap));
}
return sb.toString();
}
}));
}
// 獲取校驗錯誤結果
for (Future future : futures) {
ret.append(future.get());
// logger.info("future result:" + future.get());
}
// 關閉多線程
executorService.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
return "";
}
protected String syncAnalyseExcel(JSONArray dataArray, int nThreads, HashMap param)
throws InterruptedException, ExecutionException {
StringBuffer ret = new StringBuffer();
int size = dataArray.size();
int num = nThreads;
if (size % nThreads != 0) {
num = nThreads + 1;
}
// 多線程池
ExecutorService executorService = Executors.newFixedThreadPool(num);
// 設置基本參數
final HashMap paramMap = param;
List<Future> futures = new ArrayList(num);
for (int i = 0; i < nThreads; i++) {
// 根據文件大小和線程數獲取子列表
final List subList = dataArray.subList(size / nThreads * i, size / nThreads * (i + 1));
Callable task = new Callable() {
@Override
public String call() throws Exception {
StringBuffer sb = new StringBuffer();
for (Object obj : subList) {
// 執行解析操作,返回驗證結果
//logger.info("======current Thread:{}", Thread.currentThread().getName());
// sb.append(executeAnalyse(JSONObject.parseObject(obj.toString()), paramMap));
}
return sb.toString();
}
};
futures.add(executorService.submit(task));
}
if (size % nThreads != 0) {
final List subList2 = dataArray.subList(size - (size % nThreads), size);
futures.add(executorService.submit(new Callable() {
@Override
public String call() throws Exception {
StringBuffer sb = new StringBuffer();
for (Object obj : subList2) {
// 執行解析操作,返回驗證結果
// logger.info("======current Thread:{}", Thread.currentThread().getName());
// sb.append(executeAnalyse(JSONObject.parseObject(obj.toString()), paramMap));
}
return sb.toString();
}
}));
}
// 獲取校驗錯誤結果
for (Future future : futures) {
ret.append(future.get());
// logger.info("future result:" + future.get());
}
// 關閉多線程
executorService.shutdown();
return ret.toString();
}
}