Le Multithreading au printemps

Je suis en train d'essayer d'entrer dans le printemps de multithreading et j'ai quelques questions.

J'ai praticable méthode dans ThreadRating classe. Maintenant, je ne suis pas sûr de la meilleure façon de l'utiliser.

l'option 1, je trouve:

private void updateRating() {
        ExecutorService executor = Executors.newFixedThreadPool(10);

    for (int i = 0; i < 10; i++) { //test
        //thread part
        Runnable worker = new ThreadRating(path, i, products.get(i), dao, fileHandler);
        executor.execute(worker);
    }
    executor.shutdown();
    try {
        executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
    } catch (InterruptedException e) {
        log.error("There was an error when ending threads");
        System.exit(1);
    }
    System.out.println("Finished all threads");
}

Cela semble être en cours d'exécution fine. Après la boucle for, il attend jusqu'à ce que les threads sont finis et se termine.

Deuxième option, j'ai essayé

private TaskExecutor taskExecutor;

public UpdateBO(TaskExecutor taskExecutor) {
    this.taskExecutor = taskExecutor;
}

private void updateRating() {
        for (int i = 0; i < 10; i++) { //test
            Runnable worker = new ThreadRating(path, i, products.get(i), dao, fileHandler);
            taskExecutor.execute(worker);
        }
    //wait for threads to be finished before you go any further ??
        }

Et dans le fichier xml, j'ai

<beans:bean id="taskExecutor"
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <beans:property name="corePoolSize" value="5" />
    <beans:property name="maxPoolSize" value="10" />
    <beans:property name="queueCapacity" value="25" />
    <beans:property name="waitForTasksToCompleteOnShutdown" value="true" />
</beans:bean>

<beans:bean id="updateBO" class="UpdateBO">
    <beans:constructor-arg ref="taskExecutor" />
</beans:bean>

Et voici mes questions:

  1. Quelle est la différence entre ces deux options? La vitesse, la mémoire, les fuites possibles? Ou sont-ils la même juste écrit différemment?
  2. Ai-je besoin de l'arrêt de la piscine lors de l'utilisation d'un webservice? Je sais que dans la seconde option, je n'ai pas, mais est-il de même lors de l'utilisation d'un webservice?
  3. Lors de l'utilisation de la deuxième option - comment devrais-je dire de l'attendre jusqu'à ce que toutes les tâches sont terminées? Dans la première option, je viens de fermer la piscine vers le bas et d'attendre à la fin. Mais dans la deuxième option, la demande de code est terminé avant que les travaux sont terminés.
  4. executor.execute(worker); - juste pour clarifier. Ce n'est pas réellement de la création d'un nouveau thread, mais il ajoute tâche à une file d'attente et si la file est pleine, il attend à droite sur cette ligne dans le code jusqu'à ce qu'il est libre?

Merci pour m'aider à comprendre.

La fermeture de la piscine les exécuteurs n'est pas de bonnes options, dans certains environnements comme serveur d'application activée l'option de sécurité de tentative d'arrêt de l'exécuteur sera la cause de l'exception de sécurité. Si vous avez besoin d'attendre les travailleurs jusqu'à la fin, l'utilisation Futures au lieu de Runnables.

OriginalL'auteur Elis.jane | 2015-04-07