2017-07-06 4 views
-1

J'ai soumis deux tâches, task1 & task2 à ExecutorService. Tâche2 a besoin de 5 secondes pour terminer, et tâche1 besoin de 10 secondes. Comment puis-je arrêter la (les) tâche (s) soumise (s) (tâche1) lorsque la tâche 2 est terminée et poursuivre le reste de la logique?Comment annuler une tâche incomplète sur ExecutorService

Voici mon code à ce jour:

public class mt_poc { 
    public static void action_1() throws InterruptedException { 
     System.out.println("action_1 invoke "); 
     Thread.sleep(10000); 
     action_2(); 
     System.out.println("action_1 done"); 
    } 

    public static void action_2() throws InterruptedException { 
     System.out.println("action_2 invoke "); 
     Thread.sleep(5000); 
     System.out.println("action_2 done "); 
    } 

    public static void main(String[] args) {      
     System.out.println("TEST");   
     Runnable task1 = new Runnable() { 
      public void run() { 
       try { 
        action_1(); 
       } 
       catch(InterruptedException e) { 
        System.out.println("action_1 invoke interrupted"); 
       } 
       System.out.println("action_1 invoke run is over"); 
       } 
      }; 

     Runnable task2 = new Runnable() { 
      public void run() { 
       try { 
        action_2(); 
       } 
       catch(InterruptedException e) { 
        System.out.println("action_2 invoke interrupted"); 
       } 
       System.out.println("action_2 invoke run is over"); 
       } 
      };   

     ExecutorService executor = Executors.newFixedThreadPool(2); 

     try { 
      executor.submit(task1); 
      executor.submit(task2); 
      // cancel uncomplete task 
      executor.shutdown(); 
      executor.awaitTermination(5, TimeUnit.SECONDS); 
      // continues the rest of logic 
     } catch (InterruptedException e) { 
       e.printStackTrace(); 
     } 

     System.out.println("Shutdown executor"); 
    } 
} 

Répondre

0

Vous avez à récupérer les objets Future de la fonction submit.
Ceux-ci sont utilisés pour contrôler le thread en cours d'exécution et obtenir le statut de celui-ci. Si vous avez des contrats à terme, appelez le Future2.get(). Cela bloquera le thread jusqu'à ce que le Task2 soit terminé. Non, vous pouvez utiliser Future1.cancel(true) pour annuler l'autre thread.

Mais la mise en pause et la reprise ne sont pas possibles. Voir Java ExecutorService pause/resume a specific thread

Si vous voulez un comportement spécifique, vous devez utiliser Threads.

Mais pourquoi vous voulez le faire dans des threads séparés car il serait beaucoup plus simple et efficace d'en utiliser un seul.