2016-04-26 18 views
0

私は、異なるURLからの応答を取得し、返す前にデータを操作するJavaサーブレットへのajax呼び出しを行っています。現在、多くのURLがあるので、逐次処理ではなくプロセスをスピードアップするために、私はCountDownLatchを使用し、各URLレスポンス(私はマルチスレッドに使用します)用のクラスを作成しました。私は各応答クラスからメインサーブレットにデータを返す方法を理解できないので、データを操作してajax呼び出しに返すことができます。マルチスレッドを使用する異なるURLから応答を取得

ここでは、私のサーブレットのdoget()がajax呼び出しによって呼び出されます。

private static CountDownLatch _latch; 
private static int N = 2; 
_latch = new CountDownLatch(N); 
try { 
new Thread(new FirstUrl(_latch)).start(); 
new Thread(new SecondUrl(_latch)).start(); 
_latch.await(); 
} 
catch (InterruptedException e) { 
e.printStackTrace(); 
} 

ここでは、URL応答クラスを示します。

public class SecondUrl implements Runnable { 

private CountDownLatch _latch = null; 
public SecondUrl(CountDownLatch _latch) { 
    this._latch = _latch; 
} 


public void run() { 
    URI uri; 
    try { 
     uri = new URI("http://url1.com"); 
     JSONTokener tokener = new JSONTokener(uri.toURL().openStream()); 
     JSONObject root = new JSONObject(tokener); 
     _latch.countDown(); 
    } catch (URISyntaxException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    }  
} 

同様に、異なるURLを持つ別のクラスがあります。私はそれを操作することができるように、サーブレットにJSONObjectの結果を戻す方法。

私はマルチスレッド化に新しいので、私はアプローチについて間違っているかもしれません。気軽に指摘してください。ありがとう。

+0

個人的に私はajax約束を使用して、それらがすべて完了するのを待つでしょう –

+0

結果を返したSecondUrlのメソッドを持っていて、SecondUrlの具体的なインスタンスを作成した場合、待機後にこのメソッドを呼び出すことができます –

+0

@ ScaryWombat私はあまりにも、それのおかげで、アヤックスを試してみます。私はデフォルトのコンストラクタを定義する必要があります関数を呼び出して? FirstUrlのコンストラクタは引数としてラッチをとるためです。 – Jaydeep

答えて

1

RunnableではなくCallableを使用します。 Futureインターフェイスを見てください。

+0

ええ先物 - それは話です –

0

(多くの)方法(スレッドから結果を戻す)は、メインスレッドで初期化されたArrayBlockingQueueへの参照をスレッドに渡すことです。結果をキューに追加することができます。メインスレッドでは、データを利用できるように処理するか、最後に処理します(_latch.await()を終了した後)。

0

個々のスレッドで結果を結合するために同期メソッドを使用しようとすると、Runnableの使用は問題ありません。

SecondUrlの2番目のクラスは必要ありません。単一のクラスを使用することができ、そのURLをパラメータとしてクラスに渡すことができます。

関連する問題