2012-10-23 24 views
1

停止內部方法我創建了一個未來的任務,並提交給執行器。在run()方法中,我創建了一個placementPlanner對象。此類中的方法調用其他類。但是當我調用executor.shutDownNow()時,調用的內部方法不會停止執行。如何調用我殺死所有的子線程並停止調用方法。代碼如下。executor.shutDownNow()不從執行

static List<Result> invokePlacementPlannerWithTimeout(int timeoutSecs, 
     final String requestType, final RequestMap requestMap, 
     final ReleaseMap releaseMap, final SysConfig systemConfig, 
     final Request request, final SigmaBlade hostData, 
     final ServiceLevelData serviceLevelData, 
     final List<Service> serviceList, final String transactionID) throws IOException { 

    /** 
    * Object of ExecutorService interface used for timed execution of Placement 
    * Planner. 
    */ 
    ExecutorService executor = Executors.newFixedThreadPool(1); 
    /** 
    * Creating a final List of Result type. 
    */ 
    final List<Result> resultList = new ArrayList<Result>(); 
    /** 
    * set the executor thread working 
    */ 
    Future<?> future = executor.submit(new Runnable() { 

     public void run() { 

      try { 
       Result result = new Result(); 
       PlacementPlanner planner = new PlacementPlanner(); 

       result.setRequestMapACK(planner.getRequestResult(
          requestMap, systemConfig, request, hostData, 
          serviceLevelData, transactionID, 
          configFileLocation)); 

       resultList.add(result); 
      } catch (Exception e) { 
       System.out.println("Exception in run method in invokePlacementPlannerWithTimeout method in Controller"); 
       throw new RuntimeException(e); 
      } 
     } 

    }); 

    try { 
     /** 
     * invoking the future task with specified timeout. 
     */ 
     // System.out.println(timeoutSecs); 
     future.get(timeoutSecs, TimeUnit.MILLISECONDS); 

     /** 
     * Shutting down the service after successful execution. 
     */ 
     executor.shutdownNow(); 
    } catch (Exception e) { 
     /** 
     * Shutting down the service if timeout is occured. 
     */ 
     executor.shutdownNow(); 

     /** 
     * Canceling the task for future use. 
     */ 
     future.cancel(true); 

     System.out.println("Timeout Occureed."); 
     Runtime.getRuntime().exec("taskkill /F /IM " + "QNSim.exe*"); 
    } 
    return resultList; 
} 

回答

6

javadoc

有沒有保證盡最大努力,試圖停止處理 正在執行的任務。例如,典型的實現將 通過了Thread.interrupt()取消,使無法到 響應中斷任何任務可能永遠不會終止

所以,shutdownNow()不保證任務立即終止。

+1

(你應該做的是讓你的線程正確中斷。[這](http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html)可能是如何的最佳來源妥善處理中斷。 –

1

如果要取消,這將interruptrunning的任務,如果mayInterruptIfRunning值爲true的任務,您應該使用future.cancel()shutdownNow最終會嘗試取消Thread.interrupt(),我猜你不想這樣做。

另一種方法是檢查Thread.isInterrupted()狀態運行中的方法,如果它真的只是打破你的代碼將打破,當你調用shutdownNowcancel

2

如果你真的需要停止線程,你可以考慮使用已棄用Thread.stop(),因爲這不是唯一有效的方法。但只有在仔細閱讀javadoc的@deprecated部分之後。

(我想到很多downvotes對這個答案)。