一段时间以来,我一直在多线程环境中使用 HttpClient。对于每个线程,当它发起一个连接时,它会创建一个全新的 HttpClient 实例。
最近发现,使用这种方式会导致用户打开的端口过多,大部分连接都处于TIME_WAIT状态。
http://www.opensubscriber.com/message/commons-httpclient-dev@jakarta.apache.org/86045.html
因此,不是每个线程都在做:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
我们计划拥有:
[方法一]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
在正常情况下,global_c 将被 50++ 个线程同时访问。我想知道,这会产生任何性能问题吗?MultiThreadedHttpConnectionManager 是否使用无锁机制来实现其线程安全策略?
如果有 10 个线程在使用 global_c,其他 40 个线程会被锁定吗?
或者,如果在每个线程中创建一个 HttpClient 的实例,但显式释放连接管理器会更好吗?
[方法B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
connman.shutdown() 会遇到性能问题吗?
对于使用 50++ 线程的应用程序,我可以知道哪种方法(A 或 B)更好吗?