如何在线程中有一个有效的循环

我正在调用一些通过一些回调函数返回响应的服务。 我使用线程来调用此服务,以便它在自己的进程中运行。 该线程在我的主线程中调用。

我的问题是如何在调用此服务时优化忙碌的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:我的下一步思路就是使用闩锁

 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); } } } 

没有睡眠命令,但我不确定重新初始化锁存器是一个好方法。 该服务有时需要时间才能返回。 注意..我还没有尝试过这个代码..我只是输入它所以我不确定这是否可行。

幸运的是,JAVA 5中有很多选项可以使用:

1)循环障碍:创建一个2的循环障碍,并且当通过主线程调用responseReturned时,你可以简单地设置循环障碍等待函数来实现它。 它的优点是您可以一次又一次地重复使用相同的屏障,而无需重新初始化它。

2)CountDown Latch创建一个倒计时锁存器1,一旦responseReturned调用latch的倒计时function,运行中的await函数将允许它向前移动。 它有一个缺点,你必须重新初始化latch,以防你想重用它。

3)ExecutorService您也可以使用ExecutorService并调用future对象get方法,等待返回正确的响应。

4)信号量您也可以在调用服务之前使用aquire并在responseReturned中释放它。 在运行中,您可以再次调用aquire post call等待直到返回响应。

所有这些都将允许您以几乎相似的效率实现function。

希望有所帮助。

未来的接口可以用于这种类型的交互以及我猜测的ExecutorService。 提交请求后,您可以设置回调的超时等。

 Future futureTask = executorService.submit(callable); String result = null; try { result = futureTask.get(500, TimeUnit.MILLISECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { e.printStackTrace(); }