how tomcat works第四章中对于HttpConnector和HttpProcessor并发中notifyAll的疑问,可以使用notify吗? 在看how tomcat works书中的第四章中提到了利用线程池并发处理请求,但是有些问题不太懂,请各位指点:
我理解HttpConnector是主线程,在接收到请求后就会去HttpProcessor这个线程池里面获取空闲的线程来处理这个请求,如果没有则丢弃这个请求,一个处理器线程在同一时刻应该只会处理一个请求才对。
但是在HttpProcessor的assign方法和awit()方法中都是使用notifyAll,书上的解释是:这是为了防止在available为true的时候另一个socket到来。在这种情况下,连接器线程将会在assign方法的while循环中停止,直到接收到处理器线程的notifyAll调用??。 这个为什么呢?
如下是await和assign方法对应的代码
synchronized void assign(Socket socket) {
// Wait for the Processor to get the previous Socket
while (available) {
try {
wait();
} catch (InterruptedException e) {
}
}
// Store the newly available Socket and notify our thread
this.socket = socket;
available = true;
notifyAll();
if ((debug >= 1) && (socket != null))
log(" An incoming request is being assigned");
}
?private synchronized Socket await() {
// Wait for the Connector to provide a new Socket
while (!available) {
try {
wait();
} catch (InterruptedException e) {
}
}
// Notify the Connector that we have received this Socket
Socket socket = this.socket;
available = false;
notifyAll();
if ((debug >= 1) && (socket != null))
log(" The incoming request has been awaited");
return (socket);
}
?
线程里面notifyAll一般会比notify用的多,我的理解主要是,notifyAll会去激活所有之前wait的线程,而notify只会随机激活某一个wait的线程。
######我理解一个HttpProcessor处理线程只会和一个请求对应上,不会有阻塞的情况,所以notify应该就足够了,但是按照书上的说法,似乎存在一个HttpProcessor处理线程对应多个请求的情况,但是会是什么情况下出现,怎么出现呢?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。