2010-12-16 26 views
1

這是我第一次進入多線程領域,我目前正在使用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 
} 
} 

我主要興趣,如果我的靜態內部類的解決方案將創造一個多線程環境的任何問題,但也有興趣在上述方案中的任何其他評論。請注意,上面的代碼有可能不是完美的,因爲它仍然有點僞代碼,我已經很多了。錯誤處理也已被刪除。提前致謝。

+0

'RepositoryFutureTask'不是一個內部類。內部類看起來像這樣:http://download.oracle.com/javase/tutorial/java/javaOO/innerclasses.html – thejh 2010-12-16 11:59:31

+0

@thejh - 道歉,我上面的代碼缺乏外部類定義。現在添加(儘管格式是STILL關閉,grr)。 – 2010-12-16 12:07:28

回答

2

如果在靜態嵌套類中有一個​​靜態方法,它將鎖定與外部類相同的不同對象。我真的會推薦在任何方法上使用​​修飾符,特別是在靜態方法上。

更多的問題與匿名內部類,鎖this將有所不同。即使你寫了synchronized (this) {這真的不是那麼明顯。我已經看到它做了幾次。

理論上我猜你可能會遇到麻煩,如果嵌套類靜態初始化與外部nester類靜態初始化並行運行。從技術上講,這與在兩個外部類中運行靜態intiailsers相同,但是您更可能具有嵌套類的循環依賴關係。

1

使用靜態內部類沒有問題。唯一的問題是private String id;不是final。使它final,你會沒事的線程安全;-)

+0

很好,謝謝 – 2010-12-21 11:07:14

相關問題