首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >长轮询实现

长轮询实现
EN

Stack Overflow用户
提问于 2016-01-19 10:22:15
回答 2查看 1.7K关注 0票数 0

我已经实现了一个长轮询实现。发生的事情是,当请求到来时,我检查一些数据是否可用,如果没有,让线程休眠,并递归地调用该方法,直到数据可用。

代码语言:javascript
运行
复制
int time = 0;
String data;

public void checkme() {    
    time++;
    if (data == null && time < 100) {
        System.out.println("recursive call "+time);
        try {
           Thread.sleep(5000);
        } catch (InterruptedException e) {
           e.printStackTrace();
        }
        checkme();
        } else {
           System.out.println("end recursive call. data available");
        }
}

但是,即使我在postman中取消了请求,递归调用仍然在后台进行。

所以我认为我的长轮询实现是错误的,我可能需要在以后跟踪来自服务的请求,或者使用类似队列的数据结构。

EN

回答 2

Stack Overflow用户

发布于 2016-01-19 10:30:08

我认为,当您取消请求时,您没有做任何破坏代码或关闭应用程序的操作。

您有没有办法知道该代码中的请求是否被取消了?如果是,只需将其添加到条件中。当然,代码会一直挂在线程唤醒之前,但仍然会做你想做的事情。

编辑

而且,对于像while或do...while这样的简单循环,应该不再使用递归。

票数 0
EN

Stack Overflow用户

发布于 2016-01-19 10:44:30

好的,很好的等待/通知。

代码语言:javascript
运行
复制
public void waitForData ()
{
  synchronized( this )
  {
    while( data == null )
    {
      wait(5000L);
    }
  }
}

public void provideData ( String dataParam )
{
  synchronized(this)
  {
    data = dataParam;

    // This wakes the waitForData
    notifyAll();
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34867507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档