Насколько я понимаю,
В ThreadPoolExecutor в Java, если предоставляется фиксированная ограниченная очередь, когда задачи передаются в нее после потоков corePoolSize заняты, они добавляются в очередь.
Если же задачи отправляются, когда основные потоки заняты и очередь достигла своей емкости, то в случае, если максимальный размер пула больше чем настроен corePoolSize, новые задачи выполняются в новых потоках, достигая максимального размераPoolSize.
Это, по моему мнению, немного не интуитивно понятно, как я бы сказал например, задачи, отправленные первыми для выполнения. Если задачи продолжают поступать со скоростью, аналогичной скорости выполнения потоков MaximumPoolSize, задачи в очереди останутся там навсегда и никогда не будут выбраны.
Если насколько я понимаю, есть ли у исполнителя способ выбрать задачи из очереди и добавить к ней вновь отправленную задачу вместо ее выполнения.
Я использую приведенный ниже код для тест
package com.multithreading;
import java.util.concurrent.*;
import java.util.function.Function;
public class ExecutorOrder {
public static void main(String[] args) throws InterruptedException {
BlockingQueue blockingQueue = new ArrayBlockingQueue(2);
ExecutorService e = new ThreadPoolExecutor(2, 4, 5,
TimeUnit.SECONDS,blockingQueue );
Function threadGenerator = (Integer t) -> () -> {
System.out.println("This is task " + t + ", now sleeping for 2 seconds: " + Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
System.out.println("Task " + t + " exits, " + Thread.currentThread().getName());
};
e.submit(threadGenerator.apply(1));
e.submit(threadGenerator.apply(2));
e.submit(threadGenerator.apply(3));
e.submit(threadGenerator.apply(4));
e.submit(threadGenerator.apply(5));
e.submit(threadGenerator.apply(6));
Thread.sleep(3000);
e.shutdown();
//System.out.println(e.awaitTermination(7,TimeUnit.SECONDS));
}
}
Я создал пул потоков с 2 основными потоками, 4 максимальными потоками и очередью длиной 2.
Я отправляю пронумерованные задачи, которые приостанавливаются на 2 секунды и завершают выполнение.
/>Как видно из выходных данных, задачи 3 и 4, поставленные в очередь, выполняются после задач 5 и 6.
Пример вывода:
This is task 1, now sleeping for 2 seconds: pool-1-thread-1
This is task 6, now sleeping for 2 seconds: pool-1-thread-4
This is task 5, now sleeping for 2 seconds: pool-1-thread-3
This is task 2, now sleeping for 2 seconds: pool-1-thread-2
Task 5 exits, pool-1-thread-3
Task 1 exits, pool-1-thread-1
Task 2 exits, pool-1-thread-2
Task 6 exits, pool-1-thread-4
This is task 3, now sleeping for 2 seconds: pool-1-thread-2
This is task 4, now sleeping for 2 seconds: pool-1-thread-4
Task 4 exits, pool-1-thread-4
Task 3 exits, pool-1-thread-2
Подробнее здесь: https://stackoverflow.com/questions/783 ... ly-submitt
ThreadPoolExecutor: выбирать задачи из очереди вместо выполнения вновь отправленной задачи, когда очередь заполнена. ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение