Global Executor Service - PullRequest
       8

Global Executor Service

0 голосов
/ 31 октября 2018

Я хочу использовать общий пул потоков, который можно использовать в моем приложении везде, где я хочу. Должен ли я создать статическую службу Executor в главном классе. Затем использовать его там, где это необходимо? В настоящее время у меня есть это в моем основном классе (MyMainApplication.java)

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

public static final ThreadPoolExecutor getExecutor(int corePoolSize, int maxPoolSize, int keepAlive) {
    return ThreadPools.getExecutor(corePoolSize, maxPoolSize, keepAlive);
}

Мой класс пула потоков:

@Component
public class ThreadPools {

private static final int DEFAULT_CORE_POOL_SIZE = 5;
private static final int DEFAULT_MAX_POOL_SIZE = 10;
private static final int DEFAULT_KEEP_ALIVE_MS = 240;
private static int corePoolSize = DEFAULT_CORE_POOL_SIZE;
private static int maxPoolSize = DEFAULT_MAX_POOL_SIZE;
private static int poolKeepAliveInMillis = DEFAULT_KEEP_ALIVE_MS;

public static ThreadPoolExecutor getExecutor(int cpSize, int maxSize, int msTime) {

    if (cpSize != 0) {
        setCorePoolSize(cpSize);
    }
    if (maxSize != 0) {
        setMaxPoolSize(maxSize);
    }
    if (msTime != 0) {
        setKeepAlive(msTime);
    }

    return new ThreadPoolExecutor(corePoolSize, maxPoolSize, poolKeepAliveInMillis, TimeUnit.MILLISECONDS,
            new ArrayBlockingQueue<Runnable>(corePoolSize));
}

public static void setCorePoolSize(int size) {
    ThreadPools.corePoolSize = size;
}

public static void setMaxPoolSize(int size) {
    ThreadPools.maxPoolSize = size;
}

public static void setKeepAlive(int time) {
    ThreadPools.poolKeepAliveInMillis = time;
}

}

И в моем классе реализации (GetDetails.java) я получаю исполнителя следующим образом.

    public void getDetails()
    {
    int corePoolSize=25;
    int maxPoolSize=50;
    int KeepAliveTimeMs=1000;
    ExecutorService executor = MyMainApplication.getExecutor(corePoolSize, 
    maxPoolSize, keepAlive);
    ..........
    ..........
    executor.execute(runnableTask);
   }

Меня беспокоит каждый вызов getDetails (), создаст ли он новую службу-исполнитель с новым набором пулов. так, например, в производственной среде. если есть около 100 запросов для getDetails (), это приведет к созданию 100 служб-исполнителей, каждый из которых имеет свой собственный набор потоков, равный 100 * (25 corePoolSize, 50 maxPoolSize, 1000 keepTimeAlive). или будет ли весь запрос использовать общую службу исполнителя с общим / одинаковым пулом потоков (25 corePoolSize, 50 maxPoolSize, 1000 keepTimeAlive). Чтобы добиться этого, я сделал getExecutor () в main как static. Я делаю это правильно?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Создание потоков стоит дорого , в то время как пул может повторно использовать существующие потоки, что повышает производительность.

Создание пула потоков для каждого запроса является нарушением его дизайна :

Пулы потоков решают две разные проблемы:

они обычно обеспечивают улучшенную производительность при выполнении больших чисел асинхронных задач из-за уменьшения накладных расходов на вызовы для каждой задачи

и они предоставляют средства для ограничения и управления ресурсами, включая потоки, расходуемые при выполнении набора задач.

Так что лучше создать пул синглтон-потоков и использовать его везде.


Если вы решили создать пул потоков для каждого запроса, обязательно shutdown его после завершения всех задач, иначе пул не будет собирать мусор, что приводит к OutOfMemory в конце концов.

0 голосов
/ 31 октября 2018

Вы правы, что этот код будет создавать новый пул потоков каждый раз, когда вы вызываете getDetails. В конце концов с достаточным количеством обращений к нему у вас закончатся потоки.

Вы можете сохранить ExecutorService в статической переменной и получить сохраненную ссылку вместо того, чтобы каждый раз создавать новую. В качестве альтернативы вы можете использовать внедрение зависимостей и позволить инфраструктуре DI внедрять ее там, где это необходимо.

...