关于jboss的线程问题
我用jboss作网站服务器时,发现一个问题:
当我启动jboss后,用浏览器登入初始页面后,发现jboss后台自动另开启了一个线程“Thread [http-0.0.0.0-8080-2] (Running)”。但是当我关闭浏览器之后发现这个线程还一直存在。
请问各位这个现象正确吗?或是jboss的哪里配置不对?应如何关闭此线程。
[解决办法]
所有的应用服务器几乎都会启用线程池,线程池当然不会在请求完成之后立即终止。
你的程序的设计不应该假设请求完成这个线程就终止,对于一个 web 请求来讲,你可以用 Request Listener 来处理开始和结束的初始化和清理过程。这个 servlet 2.4 开始就有了这个 http servlet request listener。
对于 EJB 来讲, EJB 3.0 支持给 session bean 增加 AOP 支持,你可以在 around advice 中来处理这种情况。
[解决办法]
只要不是你通过代码创建的线程你就不需要关心它什么时候关闭。
每种应用服务器都有自己的线程池策略。
1. 一般来说保持的数量不会是等于最大值,而是保留一定比例或数量的空闲线程 (Worker thread)。
在早期你看到它一直增加没什么关系,但如果并发访问量不大却从来都不减少就有可能程序有问题。
2. 如果实际请求数(并发的+正在执行的) 大于已经开启的,那 jboss 会增加工作线程的数量的,除非到达最大数量限制。应用服务器会预测并在后台调整工作线程的数量来保持一定数量或比例的空闲线程来应付即将到来的请求。
一般来说让应用服务器突然挂起并分配新的工作线程是通常是发生在并发请求量大的时候,比如已分配 20个,正在执行 12 个未完成,现在有 10 个新的请求来了,那就会有 2 个请求挂起等待分配工作线程,当这些请求全部完成了,系统空闲时,jboss 会保留一线工作线程,但具体是一个都不释放还是释放一部分,那就跟实现的算法有关,当现在的开启线程数很小时,可能都不释放,而开启的线程数量占到最大线程数量的一定比例后就会释放一部分。
一般情况下不需要在意这些参数,除非你的并发请求量一直都很大,你需要观察请求数量与内存和CPU之间的关系。
如果你的程序需要知道一个请求什么时候开始,什么时候结束的话,可以用 Http servlet request listener 和 EJB 3.0 的 AOP around advice 来处理。