一、使用线程持有变量获取线程执行结果
/*** 线程持有变量*/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>>>>子线程处理部分工作,主线程最终执行某些操作并获取子线程操作结果返回值