グローバル・エグゼキュータ・サービス

ジャック:

私は私が好きな場所私のアプリケーション全体で使用できる共通のスレッドプールを使用します。私は、メインクラスの静的エグゼキュータのサービスを作成するものとします。必要に応じてどこにそれを使うのか?現在、私は私のメインクラスでこれを持っている(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フレームワークを聞かせてことができます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=212686&siteId=1