2017-09-19 5 views
0

enter image description here Les threads ne sont pas arrêtés même après avoir appelé la méthode Interruption from Executors shutdownNow.
La fonctionnalité d'appel de thread s'exécute dans une boucle while, qui recherche l'indicateur d'interruption. J'ai essayé d'envoyer l'indicateur Interruption au thread en cours d'exécution après un certain temps, mais il est toujours en cours d'exécution. Je veux forcer l'arrêt du thread. Quelqu'un peut-il dire ce comportement. Fixation l'exemple de code Java:Quelle est la manière élégante d'arrêter un thread en cours d'exécution à partir du service d'exécution

public class TestExecutor { 


static volatile int j = 1; 

public static void main(String[] args) { 

    ExecutorService pool = Executors.newFixedThreadPool(5); 
    for (int i = 1; i <= 10; ++i) { 

     Future<Map<String, List<String>>> abc = pool.submit(new Callable<Map<String, List<String>>>() { 
     volatile boolean abortFlag = false; 
     @Override 
     public Map<String, List<String>> call() throws Exception { 


      while(!abortFlag){ 
       long start = System.currentTimeMillis(); 
       for(int k=0; k < 10e4 ;k++){ 
        abortFlag = abort(); 
        System.out.println(Thread.currentThread().getName() +" " +abortFlag); 
       } 
       System.out.println("counter val is:" +Thread.currentThread().getName() +" : " +j++); 
       long end = System.currentTimeMillis(); 
       System.out.println("time for one execution : " +" " +Thread.currentThread().getName() +" :" +(end-start)); 
       return null; 
      } 

      return null; 
     } 
     private boolean abort() { 

      if(Thread.currentThread().isInterrupted()){ 
       return true; 
      }else{ 
       return false; 
      } 

     } 
    }); 
    } 
    pool.shutdown(); 

    try { 
     if (pool.awaitTermination(3000, TimeUnit.MILLISECONDS)) { 
      System.out.println("task completed"); 
     } else { 
      System.out.println("Forcing shutdown..."); 
      pool.shutdownNow(); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 


System.out.println("Closed"); 


} 

} `

+0

double possible de [? Comment arrêter l'exécution de Exécuteur ThreadPool en java] (https://stackoverflow.com/questions/1562079/ how-to-stop-the-execution-of-executor-threadpool-in-java) – alain

+3

Fonctionne bien ici. Le programme s'arrête. –

+0

@JB: J'ai posté l'image aussi où vous pouvez voir qu'elle est toujours en cours d'exécution après que le drapeau d'abandon est vrai. S'il vous plaît voir dans edit. –

Répondre

1

Vous avez une exécution 'long' avant d'agir sur abortFlag dans while(!abortFlag). Selon la boucle ci-dessous, vous aurez jusqu'à 10k impressions avant de pouvoir quitter. Si votre application peut quitter avant de terminer cette tâche « long », puis sortir juste la boucle interne lorsque le drapeau a été basculée:

for(int k=0; k < 10e4 ;k++){ 
    abortFlag = abort(); 
    if (abortFlag) { 
     break; 
    } 
    System.out.println(Thread.currentThread().getName() +" " +abortFlag); 
} 
1

shutdown(), attendra toutes les tâches actives/file d'attente pour compléter et n'autorisera aucune nouvelle tâche à soumettre. Shutdownown(), ne permettra aucune nouvelle tâche et les tâches encore dans la file d'attente ne seront pas exécutées et les tâches/threads en cours d'exécution seront interrompus. Donc, La raison pour laquelle les threads sont encore en cours d'exécution après l'appel de shutdownNow est que les threads encore dans la boucle for seront toujours en cours d'exécution, car aucune action n'est effectuée sur abortFlag. dans la boucle for.

Changer le code Snippet:

abortFlag = abort(); 
if(abortFlag){ 
    System.out.println(Thread.currentThread().getName()+" K="+k); 
    break; 
} 

Merci Roshan