使用CompletableFuture或Future Object获取可调用值

问题描述 投票:0回答:2

[Future.get()方法是一种阻塞方法,我只希望我的主要方法不要为f.get()烦恼,而是继续执行它。

如何从Future或CompletableFuture中获取可调用的返回值,而又不影响主线程的执行并且不使用任何循环使用isDone()进行不断检查

        FutureTask<String> result = (FutureTask<String>) es.submit(new Helloo());
//      CompletableFuture<String> r =  CompletableFuture.supplyAsync(()a -> new Hello(), es);
        Future<String> r = es.submit(new Hello());
        es.execute(()->{System.out.println("hello");});
                System.out.println("Main");

                System.out.println("Main");
                System.out.println("Main");
                System.out.println("Main");
                System.out.println(r.get());

                System.out.println("Main");
                System.out.println("Main");```
java multithreading concurrency java-threads
2个回答
0
投票

如果要提供(计算/生成/检索/等)某个值,然后对该值进行异步处理,则可以通过诸如CompletableFuture之类的方法来创建CompletableFuture.supplyAsync。这将返回CompletableFuture的实例。

对于该实例,您可以调用方法thenAccept,该方法将调用给定的Consumer方法,并使用上一步提供的值作为参数。

所以有点像这样:

CompletableFuture.supplyAsync(aMethodThatWillReturnAString, yourExecutor).thenAccept((string theString) -> {
    System.out.println(theString);
});

0
投票

我假设您是指CompletableStage的回调?就像是CompletableFuture r = CompletableFuture.supplyAsync(()a-> new Hello())。thenAccept(s-> s + World());

© www.soinside.com 2019 - 2024. All rights reserved.