【发布时间】:2014-09-18 20:13:30
【问题描述】:
我有一个接收请求的 Servlet,必须处理 5 个任务(从外部服务器获取数据)并将所有数据发送回订购的客户端。
如何同时处理5个Task,5个Task全部完成后继续Servlet代码?
【问题讨论】:
标签: java multithreading servlets asynchronous
我有一个接收请求的 Servlet,必须处理 5 个任务(从外部服务器获取数据)并将所有数据发送回订购的客户端。
如何同时处理5个Task,5个Task全部完成后继续Servlet代码?
【问题讨论】:
标签: java multithreading servlets asynchronous
您可以使用CoundDownLatch
一种同步辅助,它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。
示例代码:
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(5); // 5 tasks
class Worker implements Runnable {
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
private final int threadNumber;
// you can pass additional arguments as well
Worker(CountDownLatch startSignal, CountDownLatch doneSignal,
int threadNumber) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
this.threadNumber = threadNumber;
}
public void run() {
try {
startSignal.await();
doWork(); // actual work to be performed here
doneSignal.countDown();
} catch (InterruptedException ex) {
LOGGER.error(ex);
}
}
}
// 5 new threads are started
for(int i=1;i<=5;i++){
new Thread(new Worker(startSignal, doneSignal, i)).start();
}
startSignal.countDown(); // let all threads proceed
try {
doneSignal.await(); // wait for all to finish
// all 5 tasks are finished and do whatever you want to do next
} catch (InterruptedException interruptedException) {
LOGGER.error(interruptedException);
}
【讨论】:
另一个选项是ExecutorService。有多种示例可供选择,包括:
以下是从上面找到的第一个链接中获取的一些示例代码:
ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
taskExecutor.execute(new MyTask());
}
taskExecutor.shutdown();
try {
taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
...
}
【讨论】:
ExecutorService,但它不在集群环境中。但我相信它在Java中被广泛使用。
5秒太长了,可能会占用web服务器资源,你可以让客户端发送一个请求A,触发你的5秒任务,但它不等待,立即返回。既然你知道将需要 5 秒,您可以在 5 秒后发送另一个请求 B,以获取数据。如果数据还没有准备好,您可以再过 5 秒再请求,直到达到 MAX_RETRY_COUNT(由您自己定义)。
【讨论】: