使用多线程从不同的URL获取响应

时间:2016-04-26 05:10:39

标签: java ajax multithreading servlets

我正在对Java servlet进行ajax调用,该servlet从不同的url获取响应并在发回之前操纵数据。现在因为有很多网址,为了加快进程而不是顺序处理,我使用了CountDownLatch并为每个url响应创建了一个类(我将用于多线程)。我无法理解如何将数据从每个响应类发送回主servlet,以便我可以操作并将数据发送回ajax调用。

这是我的servlet的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();
}

以下是网址响应类。

 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结果发送回servlet,以便我可以操作它。

我是多线程的新手,所以我对任何方法都可能是错的。随意指出。感谢。

3 个答案:

答案 0 :(得分:1)

使用Callable而不是Runnable。查看Future界面。

答案 1 :(得分:0)

一种(众多)方式(从线程传递结果)是向您的线程传递对主线程中初始化的ArrayBlockingQueue的引用。结果可以添加到队列中。在主线程中,您可以在数据可用时处理,也可以在最后处理(在完成_latch.await()之后)。

答案 2 :(得分:0)

尝试使用同步方法来加入'导致每个单独的线程,使用Runnable很好。

你不需要SecondUrl的第二堂课。你可以使用一个类,你可以将url作为参数传递给类。