chatgpt:
是的,在处理多个仓库的数据统计时,使用线程池可以显著提高并发性能,尤其是在需要同时处理多个独立的仓库数据时。Java 提供了强大的线程池支持,通过 java.util.concurrent
包中的 ExecutorService
和相关类,可以方便地实现这一需求。
Callable
接口的任务类,用于统计每个仓库的数据。Executors
工厂类创建一个固定大小的线程池。Future
对象获取每个任务的执行结果。以下是一个完整的 Java 示例,演示如何使用线程池来统计多个仓库的销售和库存数据:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.*;
public class WarehouseStatistics {
// 定义一个结果类来存储统计结果
static class StatisticsResult {
private String warehouseId;
private int sold;
private int remaining;
public StatisticsResult(String warehouseId, int sold, int remaining) {
this.warehouseId = warehouseId;
this.sold = sold;
this.remaining = remaining;
}
@Override
public String toString() {
return String.format("仓库 %s 的统计完成:卖出 %d 件,剩余 %d 件", warehouseId, sold, remaining);
}
}
// 定义统计任务
static class StatisticsTask implements Callable<StatisticsResult> {
private String warehouseId;
private Random random = new Random();
public StatisticsTask(String warehouseId) {
this.warehouseId = warehouseId;
}
@Override
public StatisticsResult call() throws Exception {
System.out.println("正在统计 " + warehouseId + " 的数据...");
// 模拟耗时操作,例如查询数据库
Thread.sleep(1000 + random.nextInt(2000)); // 模拟1-3秒的耗时
int sold = 10 + random.nextInt(91); // 随机卖出10-100件
int remaining = random.nextInt(101); // 随机剩余0-100件
return new StatisticsResult(warehouseId, sold, remaining);
}
}
public static void main(String[] args) {
// 创建仓库列表
List<String> warehouses = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
warehouses.add("仓库" + i);
}
// 定义线程池大小
int poolSize = 5;
ExecutorService executor = Executors.newFixedThreadPool(poolSize);
// 创建一个列表来保存Future对象
List<Future<StatisticsResult>> futures = new ArrayList<>();
// 提交所有任务
for (String warehouse : warehouses) {
StatisticsTask task = new StatisticsTask(warehouse);
Future<StatisticsResult> future = executor.submit(task);
futures.add(future);
}
// 处理结果
for (Future<StatisticsResult> future : futures) {
try {
StatisticsResult result = future.get(); // 阻塞直到任务完成
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
System.err.println("统计时出现错误: " + e.getMessage());
}
}
// 关闭线程池
executor.shutdown();
try {
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException ex) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
}
}
Callable<StatisticsResult>
接口,定义了统计每个仓库数据的任务。call
方法中,模拟了耗时的统计操作(如查询数据库),并随机生成卖出和剩余的数量。main
):
Executors.newFixedThreadPool(5)
创建一个固定大小为5的线程池,这意味着最多同时有5个任务在执行。StatisticsTask
,并提交给线程池执行,返回的 Future
对象保存在 futures
列表中。futures
列表,调用 future.get()
获取每个任务的结果,这里 get()
方法会阻塞直到任务完成。executor.shutdown()
关闭线程池,并使用 awaitTermination
等待所有任务完成,如果超时则强制关闭。