使用 Future 的异步 API 永远不会完成

Async API using Future never completes

我尝试将 API 同步为:

Future<Integer> fASync(int x) {
        return new FutureTask(() -> {
            try {
                Thread.sleep(new Random().nextInt(1, 3) * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return x * x;
        });
    }

..然后我尝试使用它:

Future<Integer> asyncCall = fASync(x);
asyncCall .get();

但这永远不会完成,只会调用块。

这不是使 API 异步的正确方法吗?

您已经声明了一个 FutureTask 但实际上并没有 运行 它所以对 asyncCall.get() 的调用将永远阻塞。

这是您的示例,其中包含额外的日志记录并添加了一个步骤以在新的 ExecutorService 中执行任务。

static FutureTask<Integer> fASync(int x) {
    System.out.println("fASync("+x+") called");
    return new FutureTask<>(() -> {
        System.out.println("fASync("+x+") FutureTask has started");
        try {
            Thread.sleep(new Random().nextInt(1, 3) * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("fASync("+x+") FutureTask has ended");
        return x * x;
    });
}

public static void main(String[] args) throws InterruptedException, ExecutionException {
    ExecutorService exec = Executors.newFixedThreadPool(1);
    FutureTask<Integer> task = fASync(5);
    // MUST execute the task or task.get() will block forever
    exec.execute(task);

    System.out.println("task.get()="+task.get());

    exec.shutdown();
    exec.awaitTermination(1, TimeUnit.DAYS);
    System.out.println("ENDED");
}

如果您启用 exec.execute(task); 行,它将打印这些消息并完成 task.get(),而不是仅打印第一行并且没有来自 task.get():

的响应
fASync(5) called
fASync(5) FutureTask has started
fASync(5) FutureTask has ended
task.get()=25
ENDED