Это мой первый набег в многопоточную среду, и в настоящее время я внедряю решение с использованием библиотеки параллелизма 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
}
}
Меня в первую очередь интересует, будет ли мое статическое решение внутреннего класса создавать какие-либо проблемы в многопоточной среде, но также будут интересоваться любыми другими комментариями по вышеупомянутому решению,Обратите внимание, что есть вероятность, что приведенный выше код не идеален, поскольку он все еще несколько псевдокод, и я его много обобщил.Обработка ошибок также была удалена.Заранее спасибо.