gpt4 book ai didi

java - 用于处理并发用户的多线程 GAE servlet

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:14:20 25 4
gpt4 key购买 nike

我想对我的 GAE servlet 进行多线程处理,以便同一个实例上的同一个 servlet 可以处理多达 10 个(在前端实例上,我相信最大线程数是 10)来自不同的并发请求用户在同一时间,他们每个人之间的时间片。

public class MyServlet implements HttpServlet {
private Executor executor;

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
if(executor == null) {
ThreadFactory threadFactory = ThreadManager.currentRequestFactory();
executor = Executors.newCachedThreadPoolthreadFactory);
}

MyResult result = executor.submit(new MyTask(request));

writeResponseAndReturn(response, result);
}
}

基本上,当 GAE 启动时,第一次收到对此 servlet 的请求时,会创建一个 Executor,然后将其保存。然后每个新的 servlet 请求都使用该执行程序来生成一个新线程。显然 MyTask 中的所有内容都必须是线程安全的。

我关心的是这是否真的达到了我希望的效果。也就是说,这段代码是否创建了一个可以同时处理来自多个用户的多个请求的非阻塞 servlet?如果不是,为什么以及我需要做什么来修复它?而且,一般来说,还有什么 GAE 大师可以发现完全错误的地方吗?提前致谢。

最佳答案

我认为您的代码行不通。

doGet 方法在 servlet 容器管理的线程中运行。当一个请求进来时,一个servlet线程被占用,直到doGet方法返回才会释放。在您的代码中,executor.submit 将返回一个 Future 对象。要获得实际结果,您需要在 Future 对象上调用 get 方法,它将阻塞直到 MyTask 完成其任务。只有在那之后,doGet 方法才会返回,新的请求才能启动。

我对GAE不熟悉,但是根据their docs ,您可以将您的 servlet 声明为线程安全的,然后容器将向每个 Web 服务器并行分派(dispatch)多个请求:

<!-- in appengine-web.xml -->
<threadsafe>true</threadsafe>

关于java - 用于处理并发用户的多线程 GAE servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14864476/

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