我试图每60秒多次调用一个方法,直到该方法成功响应,该方法实际上在另一个服务上调用了一个休息结束点。截至目前,我正在使用while while循环并使用
Thread.sleep(60000);
使主线程等待60秒,由于并发问题,我认为这不是理想的方式。
我使用
遇到了CountDownLatch方法CountDownLatch latch = new CountDownLatch(1);
boolean processingCompleteWithin60Second = latch.await(60, TimeUnit.SECONDS);
@Override
public void run(){
String processStat = null;
try {
status = getStat(processStatId);
if("SUCCEEDED".equals(processStat))
{
latch.countDown();
}
} catch (Exception e) {
e.printStackTrace();
}
}
我在另一个实现runnable的类中使用了run方法。无法使这个工作。知道什么是错的吗?
答案 0 :(得分:2)
您可以使用Main
代替CompletableFuture
来返回结果:
CountDownLatch
在另一个线程中(可能在循环中):
CompletableFuture<String> future = new CompletableFuture<>();
invokeYourLogicInAnotherThread(future);
String result = future.get(); // this blocks
@Override
public void run() {
String processStat = null;
try {
status = getStat(processStatId);
if("SUCCEEDED".equals(processStat))
{
future.complete(processStat);
}
} catch (Exception e) {
future.completeExceptionally(e);
}
}
将阻止,直到通过future.get()
方法提交某些内容并返回提交的值,否则它将通过complete()
中包含的completeExceptionally()
提供异常。< / p>
还有ExecutionException
版本的超时限制:
get()
答案 1 :(得分:0)
最后使用Executor Framework让它工作。
final int[] value = new int[1];
pollExecutor.scheduleWithFixedDelay(new Runnable() {
Map<String, String> statMap = null;
@Override
public void run() {
try {
statMap = coldService.doPoll(id);
} catch (Exception e) {
}
if (statMap != null) {
for (Map.Entry<String, String> entry : statMap
.entrySet()) {
if ("failed".equals(entry.getValue())) {
value[0] = 2;
pollExecutor.shutdown();
}
}
}
}
}, 0, 5, TimeUnit.MINUTES);
try {
pollExecutor.awaitTermination(40, TimeUnit.MINUTES);
} catch (InterruptedException e) {
}