我正在调用一些通过某些回调函数返回响应的服务。 我使用线程来调用此服务,以便它在自己的进程中运行。 该线程在我的主线程中调用。
我的问题是如何在调用此服务时优化忙碌的while循环。 有时服务失败,可以继续重试循环,直到收到一个好的响应。
public class ProcessResponse extends Thread
boolean isOK = false;
public void responseReturned(Response response){
//more code
if(response.OK){
//process result
isOK = true;
}
}
public void run(){
while(true){
// call service
Thread.sleep(1000);
if(isOK)
break;
}
}
}
更新2: 我的下一步思路就是使用latch
public class ProcessResponse extends Thread
boolean isOK = false;
CountDownLatch latch = new CountDownLatch(1);
public void responseReturned(Response response){
//more code
if(response.OK){
//process result
isOK = true;
}
latch.countDown();
}
public void run(){
while(!isOK){
// call service
try {
latch.await();
} catch (InterruptedException e) {
//handle interruption
}
latch = new CountDownLatch(1);
}
}
}
没有睡眠命令,但我不确定是否重新初始化锁存器是一种好方法。该服务有时需要时间才能返回。 注意..我还没试过这个代码..我只是输入它所以我不确定这是否会起作用。
答案 0 :(得分:2)
JAVA 5中有许多选项可以使用:
1)循环障碍: 创建一个2的循环屏障,并且当通过主线程调用responseReturned时,你可以简单地设置循环屏障等待函数来实现它。它的优点是您可以一次又一次地重复使用相同的屏障,而无需重新初始化它。
2)CountDown Latch 创建一个倒计时锁存器1,一旦responseReturned调用latch的倒计时功能,运行中的await功能将允许它向前移动。它的缺点是你必须重新初始化latch,以防你想重用它。
3)ExecutorService 您还可以使用ExecutorService并可以调用future对象get方法等待,直到返回正确的响应。
4)信号量您还可以在调用服务之前使用获取并在responseReturned中释放它。在运行中,您可以再次调用aquire post call等待直到返回响应。
所有这些都将允许您以几乎相似的效率实现功能。
希望有所帮助。
答案 1 :(得分:0)
未来的接口可以用于这种类型的交互以及我猜测的ExecutorService。提交请求后,您可以设置回调的超时等。
Future<String> futureTask = executorService.submit(callable);
String result = null;
try {
result = futureTask.get(500, TimeUnit.MILLISECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
e.printStackTrace();
}