2016-04-02 13 views
0

次のコードでは、ExecutorServiceから送信されたCallableプロセスを終了します。現在、ループ実行前にシャットダウンが呼び出されても、呼び出し可能なプロセスの実行は終了しません。ExecutorServiceが呼び出す呼び出し可能なプロセスを終了する方法

提案が参考になります。

package foundation.util.sql.parser; 

import java.io.IOException; 
import java.util.HashMap; 
import java.util.concurrent.*; 

public class Test { 

    public static void main(String[] args) { 
     try { 

      final java.util.Map<String, ExecutorService> map = new HashMap<>(); 
      ExecutorService service = Executors.newFixedThreadPool(1); 
      map.put("1", service); 
Thread thread = new Thread(new Runnable() { 

       @Override 
       public void run() { 
        try { 

         System.out.println("Termination Initiated"); 
         ExecutorService executorService = map.get("1"); 
         System.out.println("ShutDown called"); 

         if(!executorService.isShutdown()) 
         { 
          executorService.shutdownNow(); 
         } 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
      Future<Boolean> submit = service.submit(new Callable<Boolean>() { 

       @Override 
       public Boolean call() throws Exception { 
        int j = 0; 
        System.out.println(Thread.currentThread().getName()); 
        for (int i=0; i<5000;i++) { 
         //Some business Process. 
         j = i; 
        } 
        System.out.println("Test____"+ j); 
        return null; 
       } 
      }); 
      thread.start(); 
      submit.get(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

答えて

0

私たちが実際に

、それが実行中のタスクを終了していないshowDownNow()呼び出すとき、それはちょうど、現在の作業の実行を停止すると試みを始めから待っているタスクを防ぐことができます。

javadoc

ごとに積極的に実行するタスクの処理を停止するベストエフォート型試みを超えた保証はありませんと。たとえば、の典型的な実装では、Thread.interrupt()、を介してキャンセルされるため、割り込みに応答しないタスクは決して終了しない可能性があります。

呼び出し可能な場合、は応答なし/割り込みの有無を確認していますinterrupt flagがtrueに設定されているかどうか定期的に確認する必要があります。その場合は、必要に応じて必要なクリーンアップを行い、終了してください。

例として、あなたのケースでは、あなたは以下のようにinterrupt flagをチェックする(あるいはどこ適用)を検討することができます貴重な応答のための

for (int i=0; i<5000;i++) { 
    //Some business Process. 
    if(Thread.currentThread().isInterrupted()) { 
    // do any cleanup and return from here. 
    return false; 
    } 
    j = i; 
} 
+0

感謝を。 – user3876801

関連する問題