Javaのエグゼキュータ・サービススタートスレッドアプリケーションの起動時

トビー周:

私のアプリケーションが起動し、エグゼキュータサービス(java.util.concurrentのExecutors.newFixedThreadPool(maxThreadNum)を使用して)オブジェクトが作成されたとき。リクエストが来た場合、エグゼキュータのサービスは、それらを処理するためにスレッドを作成します。

それは実行時にスレッドを作成するのに時間がかかるので、私は要求が来たときに、それはプロセスにそれほど時間がかかるように、アプリケーションを起動するときのスレッドを使用できるようにしたいです。

私がやったことは、次のとおりです。

executorService = Executors.newFixedThreadPool(200);
for (int i=0; i<200; i++) {
    executorService.execute(new Runnable() {
        @Override
        public void run() {
            System.out.println("Start thread in pool " );
        }
    });
}

アプリケーションの起動時にはExecutorServiceのプールに200個のスレッドを作成します。

ただ、不思議ではこれは、アプリケーションの起動時にスレッドを作成するための正しい方法は何ですか?それとも、それを行うための良い方法はありますか?

なスロー:

あなたが使用できる場合はThreadPoolExecutor、直接ではなく、ExecutorServiceからのExecutors1を、直ちにすべてのコアスレッドを起動するより標準的な/サポートされている方法は、おそらくあります。

int nThreads = 200;
ThreadPoolExecutor executor = new ThreadPoolExecutor(nThreads, nThreads, 
        0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
executor.prestartAllCoreThreads();

上記の使用prestartAllCoreThreads()

なおは、現在の実装では、Executors.newFixedThreadPool(int)作成しThreadPoolExecutor、上記と全く同じ方法で。あなたが技術的にキャストすることができ、この手段はExecutorServiceへのファクトリメソッドによって返されましたThreadPoolExecutorドキュメントには何もありません保証し、それはなりますThreadPoolExecutorがが、。


1. ThreadPoolExecutor実装ExecutorServiceが、より多くの機能を提供します。また、中にファクトリメソッドの多くのExecutorsいずれかを返すThreadPoolExecutor1つに直接またはラッパーその代表者。いくつかは、のようにnewWorkStealingPool、使用しますForkJoinPoolここでも、これらのファクトリメソッドの戻り値の型は、実装の詳細はそれにあまり依存しないされています。

おすすめ

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