Pon*_*oni 8 java multithreading tomcat threadpool
简短的问题:在Tomcat 6应用程序中 - 如何运行(单独的)线程池?
运行线程池的最佳解决方案是什么?
长问:
我这里有一个简单的需要;
轮询数据库中的某些数据,同时允许Web客户端等待答复(长轮询连接).
当数据在数据库中可用时,我会向相关客户发送回复.
这么说的话,我宁愿不潜入此刻任何框架(quartz scheduler也许?).
因此,正如我总结的那样,我需要一个线程池来在后台完成工作.
那么,如果Thread我将要使用(实际上Runnable),哪个类可以组织它?有什么ThreadPool解决方案吗?有什么建议?
Yur*_*nyy 17
回答你的简短问题:
在JVM中,线程池在java.util.concurrent.ExecutorService接口后面被抽象化.这个接口有不同的实现,但在大多数情况下,这个接口的方法就足够了.
要创建特定的线程池,请查看java.util.concurrent.Executors类:http:
//docs.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html
,其中包含用于创建不同ExecutorService接口实现的静态工厂方法.您可能感兴趣的newFixedThreadPool(int threadsNumber)和newCachedThreadPool方法.
有关ExecutorsJVM中的更多常规信息,您可能需要阅读以下Oracle教程:http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html
因此,要ExecutorService在Tomcat下使用线程池(),您应该执行以下操作:
0.1.如果尚未完成,则在界面web.xml实例中创建并注册javax.servlet.ServletContextListener(这将作为Web应用程序的入口点).
0.2.在contextInitialized(ServletContextEvent)方法中,您创建ExecutorService(线程池)的实例并将其存储在ServletContext属性映射中,以便可以从webapp中的任何位置访问它,例如:
// 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();
}
Run Code Online (Sandbox Code Playgroud)
0.3.在Servlet.service方法的某个地方或webapp中的任何地方(您应该能够ServletContext从webapp 获得对几乎任何地方的引用):
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);;
Run Code Online (Sandbox Code Playgroud)
您应该存储对myTask的引用,并可以从其他线程查询它以查明它是否已完成以及结果是什么.
希望这可以帮助...
| 归档时间: |
|
| 查看次数: |
8018 次 |
| 最近记录: |