我正在对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 作为参数传递给该类。