一、使用线程持有变量获取线程执行结果
/**
* 线程持有变量
*/
private static final ThreadLocal<Map<String, Object>> MAP_THREAD_LOCAL = ThreadLocal.withInitial(HashMap::new);
// ----------------------------------------------------------------正文
int dataSize = data.size();
// 创建线程池
ExecutorService executor = Executors.newFixedThreadPool(Thread.MAX_PRIORITY);
// 用于同步线程的计数器
CountDownLatch latch = new CountDownLatch(THREAD_COUNT);
// 计算每个线程处理的数据量
int chunkSize = dataSize / THREAD_COUNT;
Queue<Map<String, Object>> resultQueue = new ConcurrentLinkedQueue<>();
System.out.println(dataSize + "数据量总大小");
// 分块处理数据
for (int i = 0; i < THREAD_COUNT; i++) {
final int chunkStart = i * chunkSize;
final int chunkEnd = (i == THREAD_COUNT - 1) ? dataSize : (i + 1) * chunkSize;
// 提交任务到线程池
executor.submit(() -> {
processChunk(chunkStart, chunkEnd, data, dataBaseUtils, updateSupport);
resultQueue.add(MAP_THREAD_LOCAL.get());
MAP_THREAD_LOCAL.remove();
latch.countDown(); // 每个线程完成后减少计数
});
}
// 等待所有线程完成任务
latch.await();
// 关闭线程池
executor.shutdown();
二、使用PriorityBlockingQueue<Map.Entry<Integer, Callable<Map<String, Object>>>>子线程处理部分工作,主线程最终执行某些操作并获取子线程操作结果返回值