在Java中,汇总多线程结果集通常可以通过以下步骤实现:
1. 创建线程池:使用`ExecutorService`创建一个线程池,指定核心线程数、最大线程数、线程空闲时间等参数。
ExecutorService executor = new ThreadPoolExecutor(
corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()
);
2. 提交任务:通过`execute()`或`submit()`方法向线程池提交任务。任务可以是`Runnable`或`Callable`接口的实现类。
Future
future = executor.submit(new Task());
3. 获取任务结果:使用`Future`对象的`get()`方法获取任务的执行结果。该方法会阻塞当前线程,直到任务完成并返回结果。
Result result = future.get();
4. 汇总结果:可以使用线程安全的数据结构,如`ConcurrentHashMap`,来存储每个线程查询到的数据,并在汇总时进行合并。
ConcurrentHashMap
resultsMap = new ConcurrentHashMap<>(); // 在任务执行完成后,将结果存入map中
resultsMap.put(threadName, result);
5. 等待所有任务完成:如果任务数量较多,可以使用`CountDownLatch`或`CyclicBarrier`等待所有任务完成。
CountDownLatch latch = new CountDownLatch(threadSize);
// 在任务执行完成后,调用latch.countDown()
latch.countDown();
// 在所有任务开始前调用latch.await()
latch.await();
6. 处理汇总结果:在所有任务完成后,可以对`ConcurrentHashMap`中的结果进行处理,例如计算总和、平均值等。
int total = 0;
for (Result result : resultsMap.values()) {
total += result.getValue();
}
double average = (double) total / resultsMap.size();
以上步骤展示了如何在Java中使用线程池和线程安全的数据结构来汇总多线程的结果集。请根据实际需求调整代码中的参数和方法。