我们已经有了一个叶柄(Java)的web应用程序,需要做出15种不同webserivce都来自同一个方法调用。 例如: ...
public Resolution userProfile()
{
serviceOneCall();
serviceTwoCall();
serviceThreeCall();
serviceFourCall();
....
serviceTenCall();
return new RedirectResolution("profiel.jsp");
}
所有这些都可以并行调用,不依赖于对方。 有一两件事是最重要的,这些调用正在做的是把会话数据,以及一个或两个可以把数据转换成在会议上同一个对象,所以线程安全性可能是一个问题在那里。
任何人都可以提出呼吁所有这些并发的好办法?
在做并行这项工作的所有的解决方案将会产生新的线程或作业提交给一个线程池远程网络调用发生涉及。
避免线程安全问题的好方法是使用一个executorService
,并提交的子类Callable<T>
要么在submit(Callable)
或invokeAll(Collection<Callable>)
的方法),并具有可调用返回响应值。 这样,你最初的方法可以简单地处理每个调用的返回值和选择设置会话响应或更新其他对象,而不是在另一个线程发生这项工作。
所以基本算法:
- 每个这些调用的提交到在一个ExecutorService
Callable<T>
子类 - 收集
Future<T>
是你获得从ExecutorService的背 - 调用
Future.get()
每个阻塞,直到你有一个回应,然后再处理响应但是你想回到主线程
使用ExecutorService
用线程池提交Callable
S表示每次需要打电话,当有并发修改的机会,这是更新的对象同步WS。
您可能需要使用番石榴的并发扩展的更容易管理Future
S,例如使用Futures.allAsList()
将转换成一个List<Future<T>>
为Future<List<T>>
,所以你只有一个get()
做,等待所有的答案。
for (i = 0; i <= numOfServiceCalls; i++) {
new Thread(new Runnable() {
switch(i) {
case 1 : serviceOneCall();
break();
case 2 : serviceTwoCall();
break();
// Keep going with as many cases as you have.
}
});
}