我实现了一个长轮询实现。发生的事情是,当请求到来时,我检查一些数据是否可用,如果没有睡眠线程,则递归调用方法直到数据可用。
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");
}
}
但即使我在邮递员中取消请求,仍然会在后台进行递归调用。
所以我认为我的长轮询实现是错误的,我可能需要稍后从服务跟踪请求或使用类似数据结构的队列。
答案 0 :(得分:0)
我认为发生的事情是,当您取消请求时,您无法破坏该代码或关闭应用程序。
您是否有任何方法可以知道该代码中是否取消了请求?如果是,只需将其添加到条件中即可。当然代码将被卡住,直到线程唤醒,但仍然会做你想要的。
修改
你应该从递归换一个简单的循环,或者做......同时。
答案 1 :(得分:0)
好的,好老等待/通知。
public void waitForData ()
{
synchronized( this )
{
while( data == null )
{
wait(5000L);
}
}
}
public void provideData ( String dataParam )
{
synchronized(this)
{
data = dataParam;
// This wakes the waitForData
notifyAll();
}
}