我想对我的 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/