为什么我的 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
参数只指定了即使什么都不执行也要保持多少线程。这或多或少是一个性能调整参数。
我正在为我的手机游戏实现数据库连接。
我已经创建了一个连接池(它确实有效)和一个线程池,如下所示:
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
参数只指定了即使什么都不执行也要保持多少线程。这或多或少是一个性能调整参数。