私のアプリケーションが起動し、エグゼキュータサービス(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
からのExecutors
1を、直ちにすべてのコアスレッドを起動するより標準的な/サポートされている方法は、おそらくあります。
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
いずれかを返すThreadPoolExecutor
1つに直接またはラッパーその代表者。いくつかは、のようにnewWorkStealingPool
、使用しますForkJoinPool
。ここでも、これらのファクトリメソッドの戻り値の型は、実装の詳細はそれにあまり依存しないされています。