2014-06-29 2 views
-1

Как мы создаем пул потоков, используя службу Исполнителя Java, и отправляем потоки в этот пул потоков, каков порядок выполнения этих потоков?Пул потоков Java ExecutorService: порядок выполнения потоков

Я хочу, чтобы потоки были представлены первыми, выполните сначала. Например, в коде ниже, я хочу первые 5 потоков, чтобы выполняться первым, а затем последующие 5 нитей и так далее ...

// 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); 
} 

пул потоков делает Java обеспечивают любой API для этой цели, или нам нужно реализовать очередь FIFO на нашем конце, чтобы достичь этого. Если пул потоков Java не предоставляет никакой такой функции, мне действительно интересно понять причину отсутствия этой функции, поскольку она кажется очень распространенным случаем использования. Это технически невозможно (что, я думаю, маловероятно), или это просто промах?

+2

приятель написан в javadoc этого класса –

+0

Надеюсь, что те объекты MyThread просто неверно названы и на самом деле не распространяются ' java.lang.Thread'. Они должны быть просто задачами «Runnable». Исполнитель передаст им поток для выполнения. (Тот факт, что 'Thread' реализует« Runnable », является исторической ошибкой.) – Boann

ответ

4

Это поведение по умолчанию. ScheduledThreadExecutor (что вы используете, хотя вы ничего не планируете) простирается от ThreadPoolExecutor. Задачи, отправленные в ThreadPoolExecutor, хранятся в BlockingQueue, пока один поток не сможет их взять и выполнить. А очереди - это FIFO.

Это подробно описано в the javadoc.

+0

Задачи выводятся из очереди в порядке FIFO, но это не обязательно тот порядок, в котором они заполняются, если имеется более одного рабочего потока. Трудно сказать, что именно об этом спрашивает OP. – Boann

+0

В моем тесте задача не начинается в порядке FIFO, не могли бы вы помочь ответить на мой вопрос http://stackoverflow.com/questions/42153013/why-tasks-in-threadpool-are-not-executed-following- fifo-java? noredirect = 1 # comment71472912_42153013? – Jaskey

1

Нити не выполняются. Темы - это объекты, работающие на taska как Runnable и Callable. Передача такой задачи службе-исполнителю поместит ее во внутреннюю область BlockingQueue, пока она не будет поднята потоком из пула потоков. Это все равно ничего не скажет о порядке выполнения, поскольку разные классы могут делать разные вещи при реализации. Runnable

Смежные вопросы