为了账号安全,请及时绑定邮箱和手机立即绑定

等待 Java 异步调用完成

等待 Java 异步调用完成

噜噜哒 2022-09-14 10:38:56
我有一个异步函数调用其他异步函数。在Java中,如何等到异步调用完成(包括其中的任何嵌套异步调用)。我已经可以调用未来了,但没有运气。示例代码:void asyncMehodA(){ }void asyncMethodB() {asyncMehodA();}我尝试了未来可调用的方式:final Callable<Void> callable1 = new Callable<Void>() {            @Override            public Void call() {                asyncMethodB();                return null;            }        };final Future<Void> callableFuture = mExecutor.submit(callable1);    try {            callableFuture.get();        } catch (final InterruptedException | ExecutionException e) {}希望 get 函数将阻塞执行,直到异步返回。但似乎 get 函数将触发异步调用并恢复 null。而不是等待异步完成其执行。我在验证了日志语句中添加了相同的日志语句。如果我的理解是错误的,请纠正我。建议任何其他可以帮助我的概念。
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

下面是一个使用倒计时批处理的示例

package chapter13;


import java.util.concurrent.CountDownLatch;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;


public class BST {


    public static void main(String[] args) throws InterruptedException {


        final CountDownLatch latch = new CountDownLatch(1);

        final ExecutorService executorService = Executors.newCachedThreadPool();


        Runnable runnableA = () -> {

            System.out.println("Runnable A");

            latch.countDown();

            System.out.println("Runnable A finished");

        };


        Runnable runnableB = () -> {

            System.out.println("Runnable B");

            executorService.submit(runnableA);

            try {

                System.out.println("Runnable B waiting for A to complete");

                latch.await();

                System.out.println("Runnable B finished");

            } catch (InterruptedException e) {

                System.out.println("Thread interrupted");

                Thread.currentThread().interrupt();

            }

        };


        executorService.submit(runnableB);


        Thread.sleep(10);


        shutDown(executorService);

    }


    private static void shutDown(ExecutorService executorService) {


        executorService.shutdown();


        try {

            if (!executorService.awaitTermination(1, TimeUnit.SECONDS)) {

                executorService.shutdownNow();

            }

        } catch (InterruptedException e) {

            executorService.shutdownNow();

        }


    }



}

我使用方法使主线程休眠,因为在提交任务 B 后立即关闭池可能会导致池在任务 B 提交任务 A 之前停止接受新任务。Thread.sleep()


查看完整回答
反对 回复 2022-09-14
?
DIEA

TA贡献1820条经验 获得超2个赞

一种方法是使用java锁定方法。例如:


private AtomicBoolean   processed = new AtomicBoolean(true) ;

private String          result = null ;


public String doAndWait()

{

    synchronized(processed) {

        doSomethingAsync() ;

        processed.wait();

    }

    return result ;

}


public void doSomethingAsync()

{

    ...

    result="OK";

    synchronized(processed) {

        processed.notify();

    }

}


查看完整回答
反对 回复 2022-09-14
  • 2 回答
  • 0 关注
  • 185 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信