2016-06-14 15 views
-1

最初の反復が1つのスレッドで実行され、2回目の反復が別のスレッドによって実行されることを確認する方法。スレッドを使用して2つのクエリを並列で実行する方法

以下のコードスニペットでは、runQueryメソッドはQueryを実行し、resultSetを出力として返します。

私はそのようなクエリを2つ持っており、両方を並列で実行したいと思います。

for (int i = 0; i < list.size(); i++) { 
    String ProcessedRecord = list.get(i); 
    String app_name = application.get(i); 

    // ResultSet feedDetails = runQuery(ProcessedRecord,app_name); 
    try { 
     System.out.println("Inside try block ... "); 
     ResultSet feedDetails = dat.runQuery(ProcessedRecord, app_name); 
     rs_feedDetails.add(feedDetails); 
    } catch(SQLException e) { 
     e.printStackTrace(); 
    } 
} 
+1

あなたは数時間前に非常に近い質問を投稿しました。 http://stackoverflow.com/questions/37811698/how-to-connect-to-3-different-databases-and-run-queries-parallel-through-jdbc – Sneh

答えて

1

あなたはExecutorServiceCallablesFuturesの助けを借りてこれを行うことができます。

以下

が修正されたコードされたコメントで述べたよう

ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); //A thread pool to execute your tasks 
    List<Future<ResultSet>> futures = new ArrayList<>(); //List to hold futures 

    for (int i = 0; i < list.size(); i++) { 
     String ProcessedRecord = list.get(i); 
     String app_name = application.get(i); 

     // ResultSet feedDetails = runQuery(ProcessedRecord,app_name); 
     try { 
      Future<ResultSet> toAdd = pool.submit(new Callable<ResultSet>() { //submit a callable of resultset to the pool 
       @Override 
       public ResultSet call() throws Exception { 
        return dat.runQuery(ProcessedRecord, app_name); 
       } 
      }); 
      futures.add(toAdd); 
     } catch(SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
    pool.shutdown(); // shut down the thread pool 
    for(int i = 0; i < futures.size(); i++) { 
     rs_feedDetails.add(futures.get(i).get()); //invoke get method of every future in your list. The get method will return you the result. 
    } 

EDIT

、特定の状況下での作業は、シリアルに同じスレッド上で実行することができる - 並列処理を適用することが可能です"parallelism"や "amountThreads"のようなExecutorServiceパラメータを使用する

+0

私は賢明ではありますが、これらのタスクは2つの異なるスレッドによって実行されます。それらは、2つの異なるスレッドによって並列に、または1つのスレッドで連続して実行されてもよい。つまり、これは質問に対する正解です。 –

+0

ええ、私はそれを指摘すべきでした。ありがとう@SeanBright – Sneh

+0

um ... ExecutorServices **の目的を敗北させるでしょう** - 'availableProcessors'(あなたの例では)が1より大きい限り、提出されたタスクは常に**並列に実行されます - 非常に速いタスク完了のまれなケースを除いて - タスクAが完了すると**タスクBが提出される*前に(天文学的にはそうではない)、2つのタスク**が次々に実行されるかもしれない'スレッド'だが、メーターに当たっている可能性は非常に高い。 – specializt

関連する問題