私は自分のモバイルゲーム用のデータベース接続を実装しています。私のThreadPoolが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()
が満たさインタフェースです私はqueriesToExecuteのBlockingQueueに100の同じ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
}
私のテストケース:私はコードで実装し、同じように見えHOD。 ThreadPoolは、各スレッドで3 executeQuery()を排除し、メソッドを並列に実行する必要があります。
どうしますか?タスクを並列に解雇されていないことを意味し
query 1
query 2
query 3
query 1
query 2
query 3
:
私はいつもこの順番で出力(もちろん、より大きな出力)を取得します。それらが並行して実行されていた場合、私はSystem.outの順序をランダムに取得するでしょうか?
何か間違っていますか?私のプロセッサは、4つのワーカースレッドを持つIntel Core i5です。私はThreadPoolを初めて使用します。
ありがとうございました!
スレッドプールには1つのタスクしかありませんか? – tkausl
私は 'scheduleTaskExecutor.scheduleAtFixedRate'をアプリケーションの先頭で一度だけ呼び出します。これは間違っていますか?私はそれがちょうど5スレッドを実行する必要があり、このスレッドのそれぞれはqueryDatabase()を呼び出すと思った。 300msごとに。 –
いいえ、スレッドプールは複数のスレッドで単一のタスクを実行しません。 1つのプールで多くのタスクを実行することができ、プールはXを同時に実行しますが、Xはスレッドの数ですが、1つのタスクは決して同時に実行されません。 [scheduleAtFixedRate](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable、%20long、%20long、%20java)を参照してください。 util.concurrent.TimeUnit)) 'このタスクの実行に期間より時間がかかると、その後の実行は遅く開始することがありますが、同時に実行されることはありません。 ' – tkausl