這是我第一次進入多線程領域,我目前正在使用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
}
}
我主要興趣,如果我的靜態內部類的解決方案將創造一個多線程環境的任何問題,但也有興趣在上述方案中的任何其他評論。請注意,上面的代碼有可能不是完美的,因爲它仍然有點僞代碼,我已經很多了。錯誤處理也已被刪除。提前致謝。
'RepositoryFutureTask'不是一個內部類。內部類看起來像這樣:http://download.oracle.com/javase/tutorial/java/javaOO/innerclasses.html – thejh 2010-12-16 11:59:31
@thejh - 道歉,我上面的代碼缺乏外部類定義。現在添加(儘管格式是STILL關閉,grr)。 – 2010-12-16 12:07:28