我正在开发一个系统,服务器需要将(每秒)值发送到多个客户端。我的想法是为每个客户端实现一个Thread来执行此操作。我用以下方式实现了Threads:
Runnable tu = new TimeUpdater(market_id);
Thread thread = ThreadManager.createBackgroundThread(tu);
thread.start();
和
public class TimeUpdater implements Runnable{
boolean close = false;
..
public void run() {
while(!close){
try {
//do something
Thread.sleep(1000);
}catch (InterruptedException e) {
}
}
}
}
要暂停线程,我只需使用:
thread.interrupt();
thread = null;
但我无法使线程暂停/恢复工作。 有没有人有更好的想法在服务器上使用GWT多线程?
错误地编辑了原帖。 - 马丁
答案 0 :(得分:1)
我很遗憾地说,但我相信google-app-engine不允许多线程。例如,请参阅here。
答案 1 :(得分:0)
首先,后台线程要求这些进程在后端运行。为此,您必须将任务发送到后端,您将在其中处于正在运行的任务中,因此添加线程只会使您的应用程序延迟更多。您实际上不需要线程来分派消息;后端请求持续10分钟。此外,您的线程将在他们自己的请求中运行;您可以在静态ram中存储线程列表以便能够访问它们,但更好的解决方案是在消息进入时分发消息,而不是将实例保持在线和休眠状态。如果您的客户端每秒向服务器发送消息,则该rpc可以只是密钥查询需要通知的其他用户,并立即发送消息。如果您使用异步数据存储过程,它将非常快。此外,如果要减少请求时间,可以让rpc启动消息发送,然后让servlet返回响应,然后在回复已经断线后完成异步请求。
我使用ThreadLocal地图和清理过滤器进行这样的后处理。 Servlet将作业发布到可运行列表,清理过滤器运行作业。只要您立即启动异步请求,它们通常在清理过滤器到达它们时完成。
https://developers.google.com/appengine/docs/java/datastore/async