我有;在等待信号灯时中断“;当我';我在Google应用程序引擎Javaservlet中使用ThreadManager和ChannelService

我有;在等待信号灯时中断“;当我';我在Google应用程序引擎Javaservlet中使用ThreadManager和ChannelService,java,google-app-engine,servlets,Java,Google App Engine,Servlets,我想通过ThreadManager.createThreadForCurrentRequestrunnable方法中的ChannelService.sendMessage发送消息。但在doGet中调用此方法时,jetty logger中有一条错误消息。 这是我在HttpServlet类中的代码: @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOE

我想通过
ThreadManager.createThreadForCurrentRequest
runnable方法中的
ChannelService.sendMessage
发送消息。但在doGet中调用此方法时,jetty logger中有一条错误消息。 这是我在HttpServlet类中的代码:

    @Override
public void  doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {
    name = req.getParameter("name");
    ThreadManager.createThreadForCurrentRequest(new Runnable() {
        @Override
        public void run() {
            for (int i = 10; i < 100; i++) {
                d = com.google.appengine.repackaged.org.joda.time.DateTime.now();
                serverTime = String.valueOf(d.getMillis());
                ChannelMessage channelMessage = new ChannelMessage("logger", i+ " Message..... " + name + " Server Time: " + serverTime + " Client Time:");
                getChannelService().sendMessage(channelMessage);

            }

        }
    }).start();

}

如何解决此问题?

ThreadManager.createThreadForCurrentRequest
线程将在请求后立即停止(中断)。在退出
doGet
方法之前,您必须在那里等待,直到它完成

所以基本上这样的线索没有任何意义。另外,您在同一个线程中完成所有的艰苦工作(我指的是循环块),而不是并行化它

大概是这样的:

@Override
public void  doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {
    name = req.getParameter("name");
    List<Future> waits = new ArrayList<>(90);
    ExecutorService executors = Executors.newFixedThreadPool(50, ThreadManager.currentRequestThreadFactory());
    for (int i = 10; i < 100; i++) {
       waits.add(executors.submit(new Callable<Boolean>() {
           Boolean call() { 
                d = com.google.appengine.repackaged.org.joda.time.DateTime.now();
                serverTime = String.valueOf(d.getMillis());
                ChannelMessage channelMessage = new ChannelMessage("logger", i+ " Message..... " + name + " Server Time: " + serverTime + " Client Time:");
                getChannelService().sendMessage(channelMessage);
                return true;
            }

        }))
    }
    for (Future f: waits) {
       f.get()
    }

}
@覆盖
公共无效数据集(HttpServletRequest请求、HttpServletResponse响应)
抛出IOException{
name=req.getParameter(“name”);
列表等待=新的ArrayList(90);
ExecutorService executors=executors.newFixedThreadPool(50,ThreadManager.currentRequestThreadFactory());
对于(int i=10;i<100;i++){
waits.add(executors.submit(new Callable()){
布尔调用(){
d=com.google.appengine.repacked.org.joda.time.DateTime.now();
serverTime=String.valueOf(d.getMillis());
ChannelMessage ChannelMessage=新的ChannelMessage(“记录器”,i+“消息…”“+name+”服务器时间:“+serverTime+”客户端时间:”);
getChannelService().sendMessage(channelMessage);
返回true;
}
}))
}
for(未来f:等待){
f、 得到()
}
}
如果您只需要一个螺纹,那么与螺纹相关的所有零件都可以卸下:

@Override
public void  doGet(HttpServletRequest req, HttpServletResponse resp)
    throws IOException {
    name = req.getParameter("name");
    for (int i = 10; i < 100; i++) {
        d = com.google.appengine.repackaged.org.joda.time.DateTime.now();
        serverTime = String.valueOf(d.getMillis());
        ChannelMessage channelMessage = new ChannelMessage("logger", i+ " Message..... " + name + " Server Time: " + serverTime + " Client Time:");
        getChannelService().sendMessage(channelMessage);
    }
}
@覆盖
公共无效数据集(HttpServletRequest请求、HttpServletResponse响应)
抛出IOException{
name=req.getParameter(“name”);
对于(int i=10;i<100;i++){
d=com.google.appengine.repacked.org.joda.time.DateTime.now();
serverTime=String.valueOf(d.getMillis());
ChannelMessage ChannelMessage=新的ChannelMessage(“记录器”,i+“消息…”“+name+”服务器时间:“+serverTime+”客户端时间:”);
getChannelService().sendMessage(channelMessage);
}
}

好的!那么,在线程中执行某些操作的解决方案是什么?调用方法的返回值是什么?我想,在您的情况下,任何东西都不重要好吧,它可以工作。但我有一个问题。
Executor.newFixedThreadPool
是否创建50个或更多线程?因为在这种情况下,我只需要一个线程。有一根线有什么意义?对于一个线程,您不需要使用ThreadManager,您已经有了当前线程,只需在主线程中执行所有操作,删除所有与多线程相关的代码
@Override
public void  doGet(HttpServletRequest req, HttpServletResponse resp)
    throws IOException {
    name = req.getParameter("name");
    for (int i = 10; i < 100; i++) {
        d = com.google.appengine.repackaged.org.joda.time.DateTime.now();
        serverTime = String.valueOf(d.getMillis());
        ChannelMessage channelMessage = new ChannelMessage("logger", i+ " Message..... " + name + " Server Time: " + serverTime + " Client Time:");
        getChannelService().sendMessage(channelMessage);
    }
}