2016-02-21 46 views
0

在我的應用程序中,用戶可以在所有已定義的應用程序上創建數據過濾器,因爲處理所有應用程序可能需要一段時間,所以我決定讓這個任務在另一個線程上執行。我使用的是:java servlets中的多線程

private static final ExecutorService executor = Executors.newSingleThreadExecutor();

public static JSON createFilter(HttpServletRequest req, HttpServletResponse resp){ 
... 
// some type checking then apply filters 
... 
for(Integer appId : appIds){ 
     executor.execute(new ApplyFilterTask(appId)); 
     } 
} 

我ApplyFilterTask很簡單:

private static class ApplyFilterTask implements Runnable{ 

    private static ManagerService ms = null; 
    int appId; 


    public ApplyFilterTask(int appId) { 
     this.appId = appId; 
    } 


    @Override 
    public void run() { 
     if (ms == null){ 
      ms = new ManagementService(); 
      } 
     try { 
      ms.applyFilters(appId); 
     } catch (Exception e) { 
      // log the error 
     } 
} 

我想有以下行爲,當用戶創建一個新的過濾器,一個新的線程將開始並逐個處理所有的應用程序(這對第二個線程可能需要一段時間),然後我想殺死線程(以節省資源)

我的p roblems是:

  • 我不知道往哪裏放executor.shutdown();在我的代碼
  • 如果另一個用戶創建一個過濾器的過程中,會發生什麼?我如何讓我的servlet使用相同的線程,或者至少等到第一個創建另一個之前完成?

在此先感謝

回答