Java在不阻塞主线程的情况下并行运行任务

时间:2019-03-01 13:22:28

标签: java multithreading java-8 future completable-future

我正在尝试使用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.");
}

2 个答案:

答案 0 :(得分:1)

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

当您启动线程并立即get,而又没有做任何事情时(如您所做的),那么就没有必要运行线程了。

答案 1 :(得分:0)

如果我理解正确的话,您要实现的目标将不是一件容易的事。您有一个进入的呼叫,并且您希望在不干扰的情况下处理此呼叫,并且希望在此线程的旁边运行独立于主进程的单独进程。 (如果我误会了,请纠正我)

我要解决此问题的方法是使用队列。您的主线程将某些内容发布到队列中并执行需要执行的内容。然后,有单独的使用者在队列上侦听,这将执行其他过程而不会影响主线程。