あなたの短い質問に答える:
JVM では、スレッド プールはインターフェイスの背後で抽象化されjava.util.concurrent.ExecutorService
ます。このインターフェースにはさまざまな実装がありますが、ほとんどの場合、このインターフェースのメソッドで十分です。
特定のスレッド プールを作成するには、次のjava.util.concurrent.Executors
クラスを参照してください:
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.htmlExecutorService
には、インターフェイス
のさまざまな実装を作成するための静的ファクトリ メソッドが含まれています。 . メソッドnewFixedThreadPool(int threadsNumber)
に興味があるかもしれません。newCachedThreadPool
JVMの一般的な情報についてExecutors
は、次の Oracle のチュートリアルを参照してください。 http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html
したがって、ExecutorService
Tomcat でスレッド プール ( ) を使用するには、次の手順を実行する必要があります。
.1. まだ完了していない場合web.xml
は、インターフェイスのインスタンス(Web アプリケーションへのエントリ ポイントのように機能します) を作成して登録します。javax.servlet.ServletContextListener
.2. メソッドでは、 (スレッドプール)contextInitialized(ServletContextEvent)
のインスタンスを作成し、それを属性マップに保存して、webapp のどのポイントからでもアクセスできるようにします。ExecutorService
ServletContext
// following method is invoked one time, when you web application starts (is deployed)
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// ...
final int numberOfThreads = ...;
final ExecutorService threadPool = Executors.newFixedThreadPool(numberOfThreads); // starts thread pool
final ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.setAttribute("threadPoolAlias", threadPool);
// ...
}
// following method is invoked one time when your web application stops (is undeployed)
public void contextDestroyed(ServletContextEvent servletContextEvent) {
// following code is just to free resources occupied by thread pool when web application is undeployed
final ExecutorService threadPool = (ExecutorService) servletContextEvent.getServletContext().getAttribute("threadPoolAlias");
threadPool.shutdown();
}
.3. メソッドのどこか、または webapp のどこか (webapp からほとんどどこ
へのServlet.service
参照も取得できるはずです):ServletContext
Callable<ResultOfMyTask> callable = new Callable<ResultOfMyTask>() {
public ResultOfMyTask call() {
// here goes your task code which is to be invoked by thread pool
}
};
final ServletContext servletContext = ...;
final ExecutorService threadPool = (ExecutorService) servletContext.getAttribute("threadPoolAlias");
final Future<ResultOfMyTask> myTask = threadPool.submit(callable);;
myTask への参照を保存する必要があり、他のスレッドからクエリを実行して、終了したかどうかと結果を確認できます。
お役に立てれば...