2010-06-07 27 views
2

Je suis confronté à un problème concernant le fil. J'ai une classe qui implémente runnable, et je peux utiliser la méthode thread.start() sur cette classe. Ma question est que j'ai une classe java.util.concurrent.ExecutorService où je peux appeler executor.submit (fil) ..différence entre thread.start() et executor.submit (thread)

quelqu'un peut-il s'il vous plaît me dire quelle est la différence entre thread.start() et executor.submit(thread) ...

Répondre

4

L'exécuteur testamentaire. La méthode submit prend un Runnable, pas un Thread. Le but de executorServices est de prendre en charge la création et la mise en pool de threads afin que le code qui les appelle ne soit pas obligé de le faire.

1

Vous ne devez pas soumettre de thread à un exécuteur. D'abord, c'est simplement un gaspillage parce que la seule méthode qui sera appelée est run(), et vous avez juste besoin d'un Runnable et n'avez pas besoin de Thread pour cela. En second lieu, bien que ce problème soit résolu dans le dernier JDK, un problème de fuite de mémoire se produisait si vous créiez beaucoup d'objets Thread et que vous n'appeliez pas .start() dessus. Fondamentalement, la création d'objets Thread alloue de la mémoire qui ne peut être récupérée qu'après l'appel de .start(). Par conséquent, faire executor.submit(thread) est potentiellement dangereux dans les JDK précédents (je pense qu'il a seulement été résolu dans JDK6 ou plus).

Pour en revenir à votre question, executor.submit (thread) n'est pas valide. C'est tout simplement faux, car un executor utilise son propre thread pour exécuter le runnable. C'est après tout le point d'utiliser un exécuteur testamentaire. Vous voulez séparer la tâche (invocation) et l'exécution. Seulement si vous voulez fournir l'exécuteur (thread), vous devriez utiliser Thread, mais il est rare que vous deviez le faire. Généralement, il est conseillé d'implémenter un Runnable et d'utiliser des exécuteurs pour l'exécuter, plutôt que de traiter vous-même avec Thread.