Question

I'n nouveau à ExecutorService, mais je ne suis pas sûr de mon approche à ce sujet. Je pourrais traiterai jusqu'à 100 threads pour une tâche connue. J'utilise le format général ci-dessous, où je crée une liste de FutureTasks, puis les soumettre à l'ExecutorService. Les retours de ExecutorService et ajoute ces résultats en attente à une autre liste. Je puis itérer sur cette liste, appelant get () sur chaque résultat en attente.

Ma requête est la suivante: ne ce bloc à chaque fois () à son tour jusqu'à avoir terminé les 100 threads? Y a-t-il une meilleure manière de faire cela ?

Ai-je raison de supposer que get () renvoie le résultat de la méthode de mise en œuvre de l'appel appelable ()? J'utilise la classe par défaut FutureTask, et ne l'ai pas sous-classé il.

ExecutorService exec = Executors.newFixedThreadPool( NUM_THREADS );

List<JobClass> originalList = new ArrayList<JobClass>();

List<SomeOtherClass> pendingResult = new ArrayList<SomeOtherClass>();

List<Future<SomeOtherClass>> resultList = new ArrayList<Future<SomeOtherClass>>();

for( JobClass sc : originalList )
    pendingResult.add( submit( sc );

for( Future<SomeOtherClass> future : futures )
    resultList.add( future.get(5, TimeUnit.SECONDS) ); 
Était-ce utile?

La solution

Bonne question, si je vous comprends bien, vous êtes inquiet au sujet de la consommation du résultat des tâches accomplies. Oui le fil bloque. La réponse de Java qui utilise le CompletionService .

Comme mentionné dans la page de documentation « Un service qui découple la production de nouvelles tâches asynchrones de la consommation des résultats des tâches accomplies ».

Autres conseils

Si vous procédez uniquement si toutes les tâches sont terminées, vous pouvez faire ce que vous suggérez. Il ne sera pas question dans lequel les tâches de commande complète. Toutefois, si vous devez passer des résultats de la tâche à un autre processeur le plus tôt possible ou faire quelque chose d'autre pendant que les tâches exécutent, vous pouvez vérifier si la tâche est terminée d'abord en utilisant la méthode isDone, par exemple, et get() d'appel si elle est complète.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top