gpt4 book ai didi

java - Servlet 似乎没有以线程方式执行

转载 作者:行者123 更新时间:2023-11-30 09:55:32 25 4
gpt4 key购买 nike

我使用运行 servlet 的 Tomcat 开发了一个简单的服务器。

servlet 调用命令行程序 - 执行大约需要 20 秒,然后通过 JSON 将结果返回给用户。问题是 - 如果我同时发出 2 个以上的请求,servlet 会阻塞,直到前面的请求之一完成。

可以在下面看到这方面的示例 - “Im in”是 servlet 的顶部,结果列表是在 servlet 执行之后。所有请求都是同时发出的——但您可以清楚地看到它们不是同时处理的。我需要在 tomcat 中更改什么设置才能同时处理所有请求?

Im in Im in FVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLEFVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLEIm inFVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLEIm inFVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLEIm inFVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLEIm inFVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLEIm inFVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLEIm inFVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLE

最佳答案

默认情况下,对 servlet 的请求是并发处理的。没有启用/禁用此行为的设置。 JavaDoc for HttpServlet 证实了这一点:

Servlets typically run on multithreaded servers, so be aware that a servlet must handle concurrent requests and be careful to synchronize access to shared resources.

但是,如果您的 servlet 实现了标记接口(interface) SingleThreadModel , servlet 将一次只处理一个请求。但是,使用此接口(interface)通常被认为是一种不好的做法,因为您没有提到它,我假设您没有使用它。

当然,即使您没有实现 SingleThreadModel,您也可以使用(可能不合适的)同步使任何 servlet 成为单线程,例如

class MyServlet extends HttpServlet {

private void Object sharedObject = new Object()

protected synchronized void doGet(HttpServletRequest req, HttpServletResponse resp) {
// method logic goes here
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp) {

synchronized(sharedObject) {
// method logic goes here
}

}

protected void doPut(HttpServletRequest req, HttpServletResponse resp) {

synchronized(this) {
// method logic goes here
}
}
}

在上面的示例中,一次只有一个线程可以执行相同的请求方法,尽管(例如)一个线程有可能在另一个线程执行时执行 doPost() doGet()

如果您不明白这是为什么,那么我建议您在进一步调查您的问题之前阅读一些有关 Java 并发编程的文章。

关于java - Servlet 似乎没有以线程方式执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2779984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com