为什么我的线程池不是';t在Java中并行运行?

为什么我的线程池不是';t在Java中并行运行?,java,multithreading,parallel-processing,threadpoolexecutor,Java,Multithreading,Parallel Processing,Threadpoolexecutor,我正在为我的手机游戏实现数据库连接 我已经创建了一个连接池(它确实可以工作)和一个线程池,如下所示: private ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5); 我在开始时只运行一次这样的任务: scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { public void run()

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

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

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(); 
    }
}
我的测试用例: 我将100个相同的
executeQuery()
方法放入查询中,以执行阻塞队列。ThreadPool应该在每个线程上消耗3个executeQuery(),并并行执行方法

发生了什么事?

我总是以这种顺序获得输出(当然是更大的输出):

这意味着任务不是并行启动的。如果它们并行运行,我会得到“随机”系统。顺序不对

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


谢谢你的建议

您只将一个任务安排给您的计划程序。所以这个任务总是按顺序执行的。您可以尝试多次安排同一任务


newScheduledThreadPool
参数仅指定即使不执行任何操作也要保持活动的线程数。这或多或少是一个性能调整参数。

您的线程池中只有一个任务吗?我只在应用程序开始时调用
scheduleTaskExecutor.scheduleAtFixedRate
一次。这是错的吗?我认为它应该只运行5个线程,每个线程都将调用queryDatabase();每隔300毫秒。不,线程池不会在多个线程上运行单个任务。在一个池中可以有很多任务,该池将并发运行其中的X个任务,其中X是线程数,但是单个任务永远不会并发运行。请参阅
如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。
我阅读了它,但不知何故,我没有看到这一部分。哦,我的上帝。谢谢您是否知道如何通过5个不同的线程并行调用
queryDatabase()
?@Spectre通过调用queryDatabase()创建5个不同的Runnable实例,并将它们全部提交到线程池。那么为什么要使用newScheduledThreadPool呢D好的。现在我明白了。但是我应该使用什么来通过5个不同的线程并行调用
queryDatabase()
?只需复制并粘贴scheduleAtFixedRate行,或者将其放入for循环中即可。
@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

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