Я хочу использовать общий пул потоков, который можно использовать в моем приложении везде, где я хочу. Должен ли я создать статическую службу 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. Я делаю это правильно?