【发布时间】:2010-12-16 11:54:13
【问题描述】:
这是我第一次涉足多线程领域,我目前正在使用 Java 并发库实现一个解决方案。该代码本质上接受了许多服务请求,异步提交所有请求,并在所有服务完成后返回响应映射。我的代码如下所示:
public OuterClass {
public IResponseMap sendAsynchronousRequests(IRequest... dataList) {
List<RepositoryFutureTask<IRequest>> futures = new ArrayList<RepositoryFutureTask<IRequest>>();
//create one future for each request in the list
for (final IRequest request : dataList) {
RepositoryFutureTask<IRequest> future = new RepositoryFutureTask<IRequest>(request.getId(), new Callable<IRequest>() {
public IResponse call() {
return request.getService().callService(request.getRequestData());
}
});
futures.add(future);
}
//Submit each future for execution
for(Future future:futures) {
//Singleton ReqeustExecutorService maintains a pool of threads via
// java.util.concurrent.ExecutorService
RequestExecutorService.execute(future);
}
//Block processing until all requests have finished and add responses to map
//based on id as they finish
IResponseMap responseMap = new ResponseMap();
for(RepositoryFutureTask future:futures) {
responseMap.put(future.getId(), future.get());
}
return responseMap;
}
static class RepositoryFutureTask extends FutureTask<IResponse> {
private String id;
public RepositoryFutureTask(String theId, Callable<IResponse> callable) {
super(callable);
id = theId;
}
//standard getter for id omitted for conciseness
}
}
我主要感兴趣的是我的静态内部类解决方案是否会在多线程环境中产生任何问题,但我也会对上述解决方案中的任何其他 cmets 感兴趣。请注意,上面的代码可能并不完美,因为它仍然有点伪代码,我已经对其进行了很多泛化。错误处理也已被删除。提前致谢。
【问题讨论】:
-
RepositoryFutureTask不是内部类。内部类如下所示:download.oracle.com/javase/tutorial/java/javaOO/… -
@thejh - 抱歉,我上面的代码缺少外部类定义。现在添加(虽然格式仍然关闭,grr)。
标签: java multithreading inner-classes