我正在为我的手机游戏实现数据库连接。
我已经创建了一个连接池(它确实可以工作)和一个如下所示的线程池:
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。
感谢您的任何想法!
答案 0 :(得分:0)
您只为调度程序安排了一项任务。所以这个任务总是按顺序执行。您可以尝试多次安排同一任务。
newScheduledThreadPool
参数仅指定即使不执行任何操作也要保留多少个线程。这或多或少是性能调整参数。