代码之家  ›  专栏  ›  技术社区  ›  Fizi

completablefuture-提供一个将bool值返回给supplysync调用的方法

  •  1
  • Fizi  · 技术社区  · 7 年前

    如果我觉得这个问题看起来很愚蠢,那么我会在很长很长的时间里回到Java。我想用 完全未来 创建非阻塞调用。我有一个返回布尔值的方法

    public boolean waitOnState(final String targetState, final long waitMs) {
            long begin = System.nanoTime()/1000000;
            synchronized (stateLock) {
                long elapsedMs = 0L;
                logger.debug(this.storeName + "-" + this.getStreamState().toString());
                while (!this.getStreamState().toString().equals(targetState)) {
    
                    if (waitMs > elapsedMs) {
                        long remainingMs = waitMs - elapsedMs;
                        try {
                            logger.debug("Waiting on stream to be in run state in "+remainingMs);
                            stateLock.wait(remainingMs);
                        } catch (final InterruptedException e) {
                            // it is ok: just move on to the next iteration
                        }
                    } else {
                        logger.debug("Cannot transit to target state");
                        return false;
                    }
                    elapsedMs = System.nanoTime()/1000000 - begin;
                }
                logger.debug("State is running - "+this.storeName);
                return true;
            }
        }
    

    我把这个函数传递给completedfuture:

    CompletableFuture<Boolean> resultHandle = 
                    CompletableFuture.supplyAsync(this.waitOnState("RUNNING", 100000));
            resultHandle.thenAccept(result -> System.out.println(result));
    

    但我犯了个错误 The method supplyAsync(Supplier<U>) in the type *CompletableFuture* is not applicable for the arguments (boolean)

    即使我将函数的返回类型更改为boolean或integer,错误仍然存在,因此我确信我正在调用 完全未来 不正确地

    1 回复  |  直到 7 年前
        1
  •  1
  •   ernest_k Petronella    7 年前

    您应该给它一个提供者,所以不要内联调用方法,而应该使它成为lambda表达式:

    CompletableFuture<Boolean> resultHandle = 
                CompletableFuture.supplyAsync(() -> 
                     this.waitOnState("RUNNING", 100000));
    

    () -> this.waitOnState("RUNNING", 100000) 是一个lambda表达式,编译器可以使 Supplier 从,但 this.waitOnState("RUNNING", 100000) 是布尔表达式。