【发布时间】:2022-10-25 02:10:42
【问题描述】:
所以我有 4 个从 DB2 获取数据的 java 方法,我已经评论了从 DB2 获取结果所需的相应时间:
db2.fetchCigarProducts(id) // time taken 625 ms
db2.fetchPowderProdcuts(id) // time taken 327 ms
db2.fetchLegacyCigars(id) // time taken 314 ms
db2.fetchDairyProduct(id) // time taken 443 ms
显然,所花费的时间会根据作为输入(参数)给出的 id 而有所不同,但这是大多数调用的平均时间。
这是代码的结构方式,调用 Function 的伪代码:
for(String itemId: combinedItemIds) {
fetchAndProcessDataFromDB2(itemId);
}
public void fetchAndProcessDataFromDB2(itemId) {
db2.fetchCigarProducts(id) // time taken 625 ms
db2.fetchPowderProdcuts(id) // time taken 327 ms
db2.fetchLegacyCigars(id) // time taken 314 ms
db2.fetchDairyProduct(id) // time taken 443 ms
}
现在在上述正常流程中(没有任何多线程),每个 itemId 的 fetchAndProcessDataFromDB2 时间约为 1500 ms ~= 1.5 秒。
因此,为了并行处理这 4 种方法以节省时间,我将这 4 种方法同步,并尝试按以下方式使用 exectorService:
public void fetchAndProcessDataFromDB2(itemId) {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(
() -> { db2.fetchCigarProducts(id); }
);
executorService.execute(
() -> { db2.fetchPowderProdcuts(id); }
);
executorService.execute(
() -> { db2.fetchLegacyCigars(id); }
);
executorService.execute(
() -> { db2.fetchDairyProduct(id); }
);
executorService.shutdown();
executorService.awaitTermination(5, TimeUnit.SECONDS);
}
我预计上述方法中有 4 种将并行执行,并且预计总共需要 400-500 毫秒的粗略时间。 但令我惊讶的是,使用 executorService 的 fetchAndProcessDataFromDB2 所用的总时间约为 1.7 秒,比没有多线程的 fetchAndProcessDataFromDB2 方法多一点。
有人可以帮我理解为什么会这样吗?任何提示/指针表示赞赏。
【问题讨论】:
-
启动执行器服务可能需要一些时间来初始化。为什么不重复使用现有的?
-
运行 4 个同时访问相同底层资源的操作并不能保证加快速度 - 您可能只是导致该资源在处理这些请求时进行额外的上下文切换。此外,请检查您没有得到所有 4 个请求共享的任何对象(例如使用一个 JDBC 连接而不是每个线程一个)或任何与共享对象同步的对象。
标签: java multithreading db2 executorservice threadpoolexecutor