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



我正在对Java servlet进行ajax调用,该servlet从不同的URL获取响应并在发送回之前操作数据。现在由于有很多 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();
}

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

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

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

一种(从线程传回结果)方法是将指向主线程中初始化的 ArrayBlockingQueue 的引用传递给线程。可以将结果添加到队列中。在主线程中,您可以在数据可用时进行处理,也可以在结束时处理(完成后_latch.await())。

尝试使用同步方法"连接"每个单独的线程,使用Runnable就可以了。

而且您不需要 SecondURL 的第二个类。 您可以使用单个类,并且可以将 URL 作为参数传递给该类。

最新更新