gpt4 book ai didi

java - 为什么我的 ThreadPool 没有在 Java 中并行运行?

转载 作者:行者123 更新时间:2023-12-03 19:55:30 24 4
gpt4 key购买 nike

我正在为我的手机游戏实现数据库连接。

我已经创建了一个连接池(它确实有效)和一个线程池,如下所示:

private ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5);

我一开始只像这样运行一次任务:

scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
public void run() {
queryDatabase();
}
}, 0, 300, TimeUnit.MILLISECONDS);

我的 queryDatabase() 方法如下所示:

private void queryDatabase(){

List<DataBaseQuery> queriesToExecute = new LinkedList<>();

if(queries.drainTo(queriesToExecute, 3) == 0){
queriesToExecute.add(queries.take());
}

for(DataBaseQuery query: queriesToExecute) {
query.executeQuery();
}
}

executeQuery() 是我在代码中实现的接口(interface)方法,它看起来像:

@Override
public void executeQuery(){
// get connection from the pool

System.out.println("query 1");
doFirstQuery(); // do first query (20-100ms) for ex. check if user already exists. Function will block for 20-100ms

System.out.println("query 2");
// do second query (20-100ms) for ex. check if email exists

System.out.println("query 3");
// do third query (20-100ms) for ex. insert new user

}

我的测试用例:我将 100 个相同的 executeQuery() 方法放入 queriesToExecute BlockingQueue。 ThreadPool 应该在每个线程上耗尽 3 个 executeQuery() 并并行执行方法。

会发生什么?

我总是按这个顺序得到输出(当然输出更大):

query 1
query 2
query 3
query 1
query 2
query 3

这意味着任务不会并行触发。如果它们并行运行,我会得到“随机”System.out 顺序吗?

我做错了什么吗?我的处理器是 Intel Core i5,有 4 个工作线程。我第一次使用 ThreadPool。

感谢您的任何想法!

最佳答案

您只为您的调度程序安排一项任务。所以这个任务总是顺序执行的。您可以尝试多次安排同一任务。

newScheduledThreadPool 参数仅指定即使没有任何内容要执行,也要保持多少个线程。这或多或少是一个性能调整参数。

关于java - 为什么我的 ThreadPool 没有在 Java 中并行运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39977514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com