相关疑难解决方法(0)

为什么我的 CompletableFuture 代码在 Java 8 中运行而不在 Java 11 中运行?

为什么这段代码在 Java 8 和 Java 11 中表现不同?

private static String test2() {
    CompletableFuture
            .runAsync(() -> IntStream.rangeClosed(1, 20).forEach(x -> {
                try {
                    Thread.sleep(500);
                    System.out.println(x);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }));

    return "Finish";
}
Run Code Online (Sandbox Code Playgroud)

我希望它打印完成,然后以 500 毫秒的间隔打印从 1 到 20 的数字,然后停止执行,它在 Java 8 中正常工作。

然而,当我在 Java 11 上运行完全相同的方法时,它打印 Finish 并终止,而没有调用 runAsync(...) 代码。我设法通过添加这样的 ExecutorService 来启动它

private static String test2() {

    final ExecutorService executorService = Executors.newFixedThreadPool(10);
    CompletableFuture
            .runAsync(() -> IntStream.rangeClosed(1, 10).forEach(x -> {
                try {
                    Thread.sleep(500);
                    System.out.println(x);
                } catch (InterruptedException e) { …
Run Code Online (Sandbox Code Playgroud)

java multithreading asynchronous completable-future java-11

7
推荐指数
1
解决办法
373
查看次数

CompletableFuture 和垃圾收集

我想触发许多一次性异步 CompletableFutures,如下所示:

for (Job job : jobs) {
 CompletableFuture.supplyAsync(() -> job.process())
   .whenComplete(this::doSomething);
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,这些 CompletableFutures 可以在whenComplete完成后被垃圾回收。但是,由于我没有存储参考文献,因此是否存在事先收集它们的风险?

java garbage-collection asynchronous completable-future

6
推荐指数
1
解决办法
729
查看次数

CompletableFuture没有得到执行。如果我使用ExecutorService池,则其工作正常,但不使用默认的forkJoin公共池

我试图运行以下类,使其终止而不执行CompletableFuture。

public class ThenApplyExample {

public static void main(String[] args) throws Exception {
    //ExecutorService es = Executors.newCachedThreadPool();
    CompletableFuture<Student> studentCompletableFuture = CompletableFuture.supplyAsync(() -> {

        try {

            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return 3;
    })// If I put executorservice created n commented above, programme work as expected.
            .thenApply(i -> {

                for (int j = 0; j <= i; j++) {
                    System.out.println("Inside first then apply");
                }
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("First then apply is …
Run Code Online (Sandbox Code Playgroud)

java multithreading java.util.concurrent concurrent.futures completable-future

4
推荐指数
1
解决办法
783
查看次数

如何在java 8中使用CompletableFuture启动异步任务并让主线程完成并退出

我有以下代码(或多或少):

ExecutorService executor = Executors.newFixedThreadPool(10);
CompletableFuture
    .supplyAsync(()->{
        return longRunningMethodThatReturnsBoolean();
    }, executor)
    .thenAcceptAsync(taskResult -> {
        logResult();
        executor.shutdown(); 
    }, executor);
Run Code Online (Sandbox Code Playgroud)

这允许主线程中的代码继续,但是我希望主线程在完成时死亡,并且未来继续在它自己的线程中工作,但是主线程保持活动状态直到 CompletableFuture 完成,即使主线程没有不再做任何事情。

我对这个有点陌生,我错过了什么吗?甚至有可能吗?

任何帮助将不胜感激!!!

java multithreading completable-future

3
推荐指数
2
解决办法
2365
查看次数