我已经实现了一个长轮询实现。发生的事情是,当请求到来时,我检查一些数据是否可用,如果没有,让线程休眠,并递归地调用该方法,直到数据可用。
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中取消了请求,递归调用仍然在后台进行。
所以我认为我的长轮询实现是错误的,我可能需要在以后跟踪来自服务的请求,或者使用类似队列的数据结构。
发布于 2016-01-19 10:30:08
我认为,当您取消请求时,您没有做任何破坏代码或关闭应用程序的操作。
您有没有办法知道该代码中的请求是否被取消了?如果是,只需将其添加到条件中。当然,代码会一直挂在线程唤醒之前,但仍然会做你想做的事情。
编辑
而且,对于像while或do...while这样的简单循环,应该不再使用递归。
发布于 2016-01-19 10:44:30
好的,很好的等待/通知。
public void waitForData ()
{
synchronized( this )
{
while( data == null )
{
wait(5000L);
}
}
}
public void provideData ( String dataParam )
{
synchronized(this)
{
data = dataParam;
// This wakes the waitForData
notifyAll();
}
}
https://stackoverflow.com/questions/34867507
复制相似问题