gpt4 book ai didi

java - Java 异步如何工作?异步方法似乎没有异步运行

转载 作者:搜寻专家 更新时间:2023-11-01 02:19:03 25 4
gpt4 key购买 nike

使用 Java 8。

我有一个 Logger 类,它在需要记录某些内容时调用 API。我意识到,如果 API 配置不当,或者 API 没有响应,我的日志操作会花费大量时间。

同步日志的例子:

public void debug(String message) {
MDC.clear();
MDC.put(SOME_KEY, "SOME_VALUE");
super.debug(message);
MDC.clear();
}

我能够查明问题出在这里,因为如果我只是评论所有内容并停止记录或做任何事情,一切都会以应有的速度运行:

public void debug(String message) {
// MDC.clear();
// MDC.put(SOME_KEY, "SOME_VALUE");
// super.debug(message);
// MDC.clear();
}

所以我想将其设为异步调用,因为我不关心它是否同步记录:

public void debug(String message) {
CompletableFuture.runAsync(() -> {
MDC.clear();
MDC.put(SOME_KEY, "SOME_VALUE");
super.debug(message);
MDC.clear();
});
}

但是对于我的主应用程序来说,这个异步调用在性能方面与同步调用一样糟糕。我错过了什么?

最佳答案

你的问题是你没有提供执行者。这可能会导致 Java 为您提供的线程少于您当前等待调试调用的线程,这意味着您仍然会遇到一些阻塞。在我的 4 核英特尔酷睿 i7-4790 和 Java 8 超线程上,我似乎同时运行了 7 个线程(逻辑 CPU 数量 - 主线程 1 个)。您可以通过使用缓存线程池提供无限数量的线程来解决此问题:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Test
{

public static void main(String[] args) throws InterruptedException
{
Executor ex = Executors.newCachedThreadPool();
for(int i=0;i<100;i++)
{
CompletableFuture.runAsync(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
System.out.println("completed");
},ex);
}
TimeUnit.SECONDS.sleep(2);
}
}

参见上面的例子,它打印了 100 次“completed”。如果您删除 ex 参数,它将打印得少得多。

然而,调试调用缓慢的根本原因可能仍需要修复,因为如果这是一项长时间运行的任务,这可能会填满您的内存。

另请参阅:(https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html):

All async methods without an explicit Executor argument are performed using the ForkJoinPool.commonPool() (unless it does not support a parallelism level of at least two, in which case, a new Thread is created to run each task). [...]

关于java - Java 异步如何工作?异步方法似乎没有异步运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56079561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com