3

私は自分のモバイルゲーム用のデータベース接続を実装しています。私の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を初めて使用します。

ありがとうございました!

+0

スレッドプールには1つのタスクしかありませんか? – tkausl

+0

私は 'scheduleTaskExecutor.scheduleAtFixedRate'をアプリケーションの先頭で一度だけ呼び出します。これは間違っていますか?私はそれがちょうど5スレッドを実行する必要があり、このスレッドのそれぞれはqueryDatabase()を呼び出すと思った。 300msごとに。 –

+0

いいえ、スレッドプールは複数のスレッドで単一のタスクを実行しません。 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

答えて

0

スケジューラには1つのタスクしかスケジュールされていません。したがって、このタスクは常に順番に実行されます。同じタスクを複数回スケジュールすることもできます。

newScheduledThreadPoolパラメータは、何も実行されなくても存続するスレッドの数を指定します。これは多かれ少なかれ性能調整パラメータです。

+0

なぜnewScheduledThreadPoolを使用するのですか? :D。今、私はそれをすべて手に入れます。しかし、5つの異なるスレッドによって 'queryDatabase()'を並列呼び出しするにはどうすればよいですか? –

+0

scheduleAtFixedRate行をコピー&ペーストするか、forループに入れてください。 –

関連する問題