【发布时间】:2013-02-08 18:27:40
【问题描述】:
如果您将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 并且没有正确使用它,或者如果我对这种并发行为的设置不正确,请先纠正我! p>
假设我或多或少地步入正轨,我对 Google App Engine 线程如何利用 MyTask 对象下的对象树有一些与并发相关的担忧。
MyTask 可调用对象负责实际处理 HTTP 请求。在 EJB 领域,这将是“业务逻辑”代码,它执行以下操作:(1) 将消息放入队列,(2) 访问 Google 数据存储以获取数据,(3) 将内容保存到缓存等。也就是说,当call() 方法由Executor 执行时,它会生成一个大的“对象树”(许多后续的子对象)。
我是否必须使从MyTask#call 内部创建的每个对象都是线程安全的?为什么或为什么不?提前致谢!
【问题讨论】:
标签: java multithreading google-app-engine concurrency