gpt4 book ai didi

java - 多线程 GAE 应用程序需要同步吗?

转载 作者:行者123 更新时间:2023-12-02 07:17:18 26 4
gpt4 key购买 nike

如果您将 ThreadManager.currentRequestThreadFactory()ExecutorService 结合使用,Google App Engine 允许您创建线程。因此,为了允许同一个前端实例同时处理多个 servlet 请求,我计划编写如下所示的代码:

public class MyServlet implements HttpServlet {
private RequestDispatcher dispatcher;

// Getter and setter for 'dispatcher'.

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
MyResponse resp = dispatcher.dispatch(request);

PrintWriter writer = response.getWriter();

// Use the 'resp' and 'writer' objects to produce the resultant HTML
// to send back to the client. Omitted for brevity.
}
}

public class RequestDispatcher {
private ThreadFactory threadFactory =
ThreadManager.currentRequestThreadFactory();

private Executor executor;

// Getters and setters for both properties.

public MyResponse dispatch(HttpServletRequest request) {
if(executor == null)
executor = Executors.newCachedThreadPool(threadFactory);

// MyTask implements Callable<MyResponse>.
MyTask task = TaskFactory.newTask(request);

MyResponse myResponse = executor.submit(task);
}
}

所以现在我相信我们有一个设置,每个前端都有一个 servlet,可以同时接受最多 10 个(我相信这是 GAE 允许的最大值)请求,并处理所有这些都是同时进行的,没有阻塞。因此,首先,如果我错误地使用了 ThreadManager 并且没有正确使用它,或者如果我对此类并发行为的设置不正确,请首先纠正我!

假设我或多或少步入正轨,我对 Google App Engine 线程如何利用 MyTask 对象下的对象树有一些与并发相关的担忧。

MyTask 可调用函数负责实际处理 HTTP 请求。在 EJB 领域,这将是“业务逻辑”代码,它执行以下操作:(1) 将消息放入队列,(2) 访问 Google 数据存储以获取数据,(3) 将内容保存到缓存等。也就是说,当 Executor 执行其 call() 方法时,它会生成一个大的“对象树”(许多后续子对象)。

我是否必须使从 MyTask#call 内部创建的每个对象都是线程安全的?为什么或为什么不?提前致谢!

最佳答案

您不需要所有这些来使实例能够同时处理多个请求。如果您在处理单个给定请求时需要并行执行多个任务,GAE 允许您生成线程。

例如,如果您需要并行联系多个外部 URL 以获取响应给定请求所需的信息,那么它可能很有用。这比按顺序联系所有 URL 更有效。

关于java - 多线程 GAE 应用程序需要同步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14779003/

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