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

时间:2016-10-11 12:42:49

标签: java multithreading parallel-processing threadpoolexecutor

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

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

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

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

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

感谢您的任何想法!

1 个答案:

答案 0 :(得分:0)

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

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