2014-06-29 5 views
-1

Lorsque nous créons un pool de threads à l'aide du service Executor de Java et soumettez des threads à ce pool de threads, dans quel ordre ces threads sont-ils exécutés?Pool de threads Java ExecutorService: Ordre d'exécution des threads

Je veux m'assurer que les threads soumis en premier, s'exécutent en premier. Par exemple, dans le code ci-dessous, je veux premier 5 fils pour obtenir exécutés en premier, suivi par les 5 fils et ainsi de suite ...

// Create a thread pool of 5 threads. 
ScheduledExecutorService exService = Executors.newScheduledThreadPool(5, new ModifiedThreadFactory("ReadThreadPool")); 

// Create 100 threads. 
MyThread[] threads = createMyThreads(100); 

// Submit these 100 threads to thread pool for execution. 
for(MyThread thread : threads) { 
    exService.submit(thread); 
} 

fil de Pool Est-ce que Java fournit une API à cet effet, ou avons-nous besoin de mettre en place une file d'attente FIFO à notre fin pour y parvenir. Si le pool de threads de Java ne fournit aucune fonctionnalité de ce type, je suis vraiment intéressé de comprendre la raison de l'inexistence de cette fonctionnalité car elle me semble être un cas d'utilisation très courant. Est-ce techniquement impossible (ce qui me semble assez improbable), ou est-ce juste un manque?

+2

buddy il est écrit dans le javadoc de cette classe –

+0

J'espère que ces objets 'MyThread' sont juste mal nommés et ne s'étendent pas réellement' java.lang.Thread'. Ils devraient simplement être des tâches 'Runnable'. L'exécuteur leur donnera un fil à exécuter. (Le fait que Thread implémente Runnable est une erreur historique.) – Boann

Répondre

4

C'est le comportement par défaut. ScheduledThreadExecutor (que vous utilisez bien que vous ne planifiez rien) s'étend de ThreadPoolExecutor. Les tâches soumises à un ThreadPoolExecutor sont stockées dans un BlockingQueue jusqu'à ce qu'un thread soit disponible pour les prendre et les exécuter. Et les files d'attente sont FIFO.

Ceci est décrit en détail dans the javadoc.

+0

Les tâches sont retirées de la file d'attente dans l'ordre FIFO, mais ce n'est pas nécessairement l'ordre dans lequel elles se terminent s'il y a plus d'un thread de travail. Il est difficile de dire si c'est ce que l'OP demande si. – Boann

+0

Dans mon test, la tâche ne démarre pas dans l'ordre FIFO, pourriez-vous aider à répondre à ma question http://stackoverflow.com/questions/42153013/why-tasks-in-threadpool-are-not-executed-following- fifo-java? noredirect = 1 # comment71472912_42153013? – Jaskey

1

Les threads ne sont pas exécutés. Les threads sont les entités exécutant des tâches telles que Runnable et Callable. La soumission d'une telle tâche à un service d'exécution la mettra dans son BlockingQueue jusqu'à ce qu'elle soit récupérée par un thread de son pool de threads. Cela ne vous dira toujours rien sur l'ordre d'exécution car différentes classes peuvent faire des choses différentes lors de l'implémentation Runnable