开发者社区> 问答> 正文

可以使用notify吗? 400 请求报错 

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);

    }

?

展开
收起
kun坤 2020-05-30 23:06:56 582 0
1 条回答
写回答
取消 提交回答
  • 线程里面notifyAll一般会比notify用的多,我的理解主要是,notifyAll会去激活所有之前wait的线程,而notify只会随机激活某一个wait的线程。

    ######我理解一个HttpProcessor处理线程只会和一个请求对应上,不会有阻塞的情况,所以notify应该就足够了,但是按照书上的说法,似乎存在一个HttpProcessor处理线程对应多个请求的情况,但是会是什么情况下出现,怎么出现呢?

    2020-05-30 23:07:01
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载