我有;在等待信号灯时中断“;当我';我在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);
}
}