gpt4 book ai didi

java - 如何在线程中建立有效的循环

转载 作者:行者123 更新时间:2023-11-30 02:08:09 26 4
gpt4 key购买 nike

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

我的问题是如何优化调用此服务时的 busy 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);
}
}
}

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

最佳答案

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

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

2) 倒计时锁存器 创建一个值为 1 的倒计时锁存器,一旦responseReturned 调用锁存器的倒计时函数,run 中的await 函数将允许它向前移动。它有一个缺点,如果你想重用它,你必须重新初始化闩锁。

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

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

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

希望有帮助。

关于java - 如何在线程中建立有效的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50901776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com