为什么我的线程池不是';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