【问题标题】:How to execute a method asynchronously on same thread in Java?如何在Java中的同一线程上异步执行方法?
【发布时间】:2020-09-23 11:18:22
【问题描述】:

我想在 Java 的单线程中异步执行一个方法(不返回任何东西,只是清理东西)。请让我知道该怎么做。

【问题讨论】:

  • 在标准 Java 中确实有 no such thing。您将需要另一个线程(来自某个地方,可能来自公共池)。
  • 您究竟为什么要在“单线程”上执行此操作?
  • 我使用的框架不是线程安全的。因此,我希望它在单线程上异步执行
  • “单线程”和“异步”是矛盾的。
  • 这只是一个名字。这些异步函数要么运行 deferred (稍后在同一个线程中,这不是异步的),要么正在确定一个封装了浏览器实现的真正异步操作的承诺(在幕后使用线程) .让你的回调在同一个线程中执行只有在特定线程实现事件循环时才有效,就像浏览器一样。使用 AWT 事件处理线程,这样的行为是可能的。对于单线程执行器的唯一工作线程也是如此。但不适用于任意线程,因为它不会执行这样的循环。

标签: java multithreading spring-boot asynchronous


【解决方案1】:

很好,这是Future<T>的一个很好的例子

Future 表示异步计算的结果。方法 提供检查计算是否完成,等待其 完成,并检索计算的结果。如果你 为了可取消性而想使用 Future 但不 提供可用的结果,您可以声明表单的类型 Future 并作为底层任务的结果返回 null。
来源:JavaDoc

这是一个非常简单的工作示例,可以实现您的要求

// Using Lambda Expression
Future<Void> future = CompletableFuture.runAsync(() -> {
    // Simulate a long-running Job   
    try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    System.out.println("I'll run in a separate thread than the main thread.");
});

// Start the future task without blocking main thread
future.get()

在幕后它仍然是另一个线程,只是为了澄清它

【讨论】:

  • "[...] 在同一个线程上异步 [...]",这是问题的基本部分。因此,不幸的是,您的答案没有回答 OP 的问题。
  • 有时可能会发生 OP 不完全融入 Java 的情况,有时他可能会问这样的特定问题,因为他不想处理原生 Thread 实现。我提供了一个答案,它以比原始线程实现更简单的方式完成了他的要求,显然在 Java 中没有像@Kayaman 所说的那样使用线程来做到这一点。
  • 我知道我们有所有这些选项,这就是为什么我在问题“相同的线程”中特别说的原因。那么,您对此有什么解决方案吗? @Snix
  • Java 不像@Kayaman 所说的那样工作。我认为你做不到。
【解决方案2】:

Java 8 在 java.util.concurrent.CompletableFuture 中引入了 CompletableFuture,可用于进行异步调用:

 CompletableFuture.runAsync(() -> {
      // method call or code to be asynch.
    });

【讨论】:

  • 我认为它在内部为此创建了一个新线程。不是吗?
  • 是的,它在底层创建了一个新线程,但异步执行的整个想法违背了单线程环境
  • 是这样吗?据我所知JS使用单线程异步执行。所以有可能。
  • JS 有一个特殊的引擎 Web API 在后台为 JS 处理这些任务。调用堆栈识别 Web API 的函数并将它们交给浏览器处理。一旦这些任务被浏览器完成,它们就会返回并作为回调被压入堆栈。
猜你喜欢
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 2015-06-09
  • 2013-04-21
  • 2023-03-24
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
相关资源
最近更新 更多