2017-09-14 9 views
0

Salut J'essaye de courir au-dessous du code, et après que l'exécuteur soit terminé je m'attends à ce que le compte de la tâche restante soit 0, mais pour plus de 100 il satisfait la condition ci-dessous.Exécuteurs n'effectuant pas toute la tâche

while(executor.isTerminated()) { 
       System.out.println("Total Task Remaining : " + ExecutorServiceExample.task.size()); 
       System.out.println("*** Executor Terminated ***"); 
       break; 
      } 

Extrait de code.

package test; 
import java.util.HashSet; 
import java.util.Set; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 

public class ExecutorServiceExample { 

    public static volatile Set<String> task = new HashSet<String>(); 

    public static void main(String args[]) { 

     ExecutorService executor = Executors.newFixedThreadPool(2000); 

     for (int i = 0; i < 10000; i++) { 
      String name = "task#" + i; 
      task.add(name); 
      Runnable runner = new TaskPrint(name); 
      executor.execute(runner); 
     } 

     try { 
      executor.shutdown(); 
      executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 
      if (executor.isTerminated()) { 
       System.out.println("Total Task Remaining : " + ExecutorServiceExample.task.size()); 
       System.out.println("*** Executor Terminated ***"); 
      } 
     } catch (InterruptedException ignored) { 
     } 
    } 
} 

class TaskPrint implements Runnable { 

    private final String name; 

    public TaskPrint(String name) { 
     this.name = name; 
    } 

    public void run() { 
     ExecutorServiceExample.task.remove(name); 
    } 
} 

Quelque chose d'étrange avec le résultat basé sur le nombre de tâches.

Sortie pour 100 tâches.

Total Task Remaining : 0 
*** Executor Terminated *** 

Sortie pour 1000 tâches.

Total Task Remaining : 0 
*** Executor Terminated *** 

Sortie pour 10000 tâches.

Total Task Remaining : -27 
*** Executor Terminated *** 

Sortie pour 100 000 tâches.

Total Task Remaining : 1205 
*** Executor Terminated *** 
+0

Je ne sais pas, mais je sais que la création de 2 milliers de threads avec 'Executors.newFixedThreadPool (2000),' demande des ennuis ... –

+1

Je me demande pourquoi cela ne sort pas avec une exception ConcurrentModificationException parce que le HashSet n'est pas synchronisé ... –

+0

@ G.Demecki Je l'ai changé pour 'ExecutorService executor = Executors.newFixedThreadPool (10);' maintenant la tâche Total restant est plus de 2000 –

Répondre

1

HashSet n'est pas sécurisé. Vous pouvez créer un synchronizedSet avec

public static volatile Set<String> task = Collections.synchronizedSet(new HashSet<String>());