首页 > 解决方案 > Java运行与主线程并行的任务而不阻塞它

问题描述

我正在尝试使用 Java 8 的 CompletableFuture 功能,该功能说它提供了异步运行的能力。但是为了执行“未来”需要调用future.get()方法。这样做会阻塞主线程。因为它在执行之后的行之前等待 30 秒睡眠future.get()

有没有办法做到这一点?执行我尝试打印的非阻塞方式

“我会在主线程中运行。”

“我将在与主线程不同的线程中运行。”

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


    CompletableFuture<Void> future = CompletableFuture.runAsync(new Runnable() {
        @Override
        public void run() {
            // Simulate a long-running Job
            try {
                TimeUnit.SECONDS.sleep(30);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            System.out.println("I'll run in a separate thread than the main thread.");
        }
    });
    future.get();
    System.out.println("I'll run in the main thread.");
}

标签: javamultithreadingjava-8futurecompletable-future

解决方案


CompletableFuture.runAsync(Runnable)已经开始运行您的其他线程。调用future.get()只是等待该线程完成运行并获得其结果的一种方式,然后再继续执行调用的线程。

当您get立即启动线程并且它之间没有做任何事情(如您所做的那样)时,那么运行线程就没有意义了。


推荐阅读