Java使用CountDownLatch轮询方法直到成功响应

时间:2017-07-13 17:36:35

标签: java multithreading timer polling countdownlatch

我试图每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方法。无法使这个工作。知道什么是错的吗?

2 个答案:

答案 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) {

            }