有一个大List集合,遍历进行一些耗时操作,不能达到性能要求,查询日志,单个任务虽然有不少数据库和第三方API请求,比较耗时,但返回效率尚可,所以优先采用多线程方式进行处理并行请求数据库和第三方API,因为处理完还要对list所属的数据进行操作,所以,线程池多线程处理要等待全部处理完:相关的代码如下:
@Test
public void testTB() {
List<String> list = new ArrayList<>();
for (int i = 0; i < 900; i++) {
list.add("a");
}
ExecutorService touchWorker = Executors.newFixedThreadPool(4, new ThreadFactoryBuilder().setNameFormat("touch-send-worker-%d").build());
int size = list.size();
if (size > 100) {
int batch = size % 100 == 0 ? size / 100 : size / 100 + 1;
for (int j = 0; j < batch; j++) {
int end = (j + 1) * 100;
if (end > size) {
end = size;
}
List<String> subList = list.subList(j * 100, end);
touchWorker.execute(() -> sleepTest(subList));
}
touchWorker.shutdown();
while (true) {
if (touchWorker.isTerminated()) {
break;
}
}
}else{
sleepTest(list);
}
}
private void sleepTest(List<String> subList) {
for (String i : subList) {
try {
//耗时操作
System.out.println("######" + i + "######" + Thread.currentThread().getName());
// Thread.sleep(1000*30);
} catch (Exception e) {
e.printStackTrace();
}
}
}
void shutdown()