【问题标题】:Java Run a task parallel to main thread without blocking itJava运行与主线程并行的任务而不阻塞它
【发布时间】:2019-07-23 13:00:25
【问题描述】:

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

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

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

之前

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

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.");
}

【问题讨论】:

  • future.get() 正在阻塞主线程,因此线程打印语句将始终位于主线程打印之前
  • 你可以移动主打印语句 before future.get() 但这似乎很简单,所以我不完全确定你的实际问题是什么 -> 你为什么需要 main-action 出现在 thread-action 之前
  • CompletableFuture.runAsync( 已经开始运行您的其他线程。调用 future.get() 只是等待该线程完成运行并获得其结果,然后再继续执行调用的线程
  • CompletableFuture 正在非阻塞运行
  • @ShenaliSilva 当您删除 get() 调用时,主线程不会被阻塞,因为在您的简化示例中没有其他内容,它将退出。当只剩下守护线程时,JVM 将终止,这就是您可能会或可能不会看到打印消息的原因,具体取决于不可预测的时间。这不是现实生活中的应用问题。但是当您简化的示例在后台线程中打印消息时,您必须等待才能终止。

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


【解决方案1】:

如果我理解正确,您想要实现的目标将不会那么容易实现。您有一个调用进入,并且您希望在不受干扰的情况下处理此调用,并且您希望在此线程旁边运行一个独立于主进程的单独进程。 (如果我理解错了,请纠正我)

我解决这个问题的方法是使用队列。您的主线程在队列上发布一些内容并执行它需要执行的内容。然后有单独的消费者在队列上监听,它们将在不影响主线程的情况下执行其他进程。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 实际场景是执行一个与主线程并行的定时器。但是该方法应该继续执行,而不会因未来的事情而被阻止。实际情况是一个 Rest Call,它被命中端点的方法。但并行执行不应阻止端点的方法返回响应
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多