为什么我的 ThreadPool 在 Java 中不是 运行 并行?

Why my ThreadPool isn't running in parallel in Java?

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

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

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() 是我在代码中实现的接口方法,它看起来像:

@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

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

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

感谢您的任何想法!

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

newScheduledThreadPool参数只指定了即使什么都不执行也要保持多少线程。这或多或少是一个性能调整参数。