私は私が好きな場所私のアプリケーション全体で使用できる共通のスレッドプールを使用します。私は、メインクラスの静的エグゼキュータのサービスを作成するものとします。必要に応じてどこにそれを使うのか?現在、私は私のメインクラスでこれを持っている(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);
}
私のThreadPoolクラス:
@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への各呼び出しのためです。本番環境で例えばそう。getDetails()100の要求について存在する場合、それは、それぞれ100 *(25 corePoolSize、50 maxPoolSize 1000 keepTimeAlive)であるスレッドプールの独自のセットを有する100エグゼキュータ・サービスを作成することになります。またはすべての要求が共通/同じスレッドプール(25 corePoolSize、50 maxPoolSize、1000 keepTimeAlive)と共通エグゼキュータ・サービスを使用します。これを実現するために、私は、静的としてメインでgetExecutor()を行いました。私はそれを正しくやっていますか?
あなたしている権利が懸念されるが、このコードでは、新しいスレッドプールにあなたがgetDetailsを呼び出すたびに作成されます。最終的にはそれに十分な呼び出しで、あなたは、スレッドが不足します。
あなたは、静的変数にExecutorServiceのを保存し、新しいものを毎回作成するのではなく、保存された参照を取得することができます。別の方法としては、依存性注入を使用し、それが必要なのどこに注入DIフレームワークを聞かせてことができます。