gpt4 book ai didi

Java CompletableFuture.runAsync 递归...有潜在风险吗?

转载 作者:行者123 更新时间:2023-12-01 09:38:34 26 4
gpt4 key购买 nike

我的要求是每 30 秒轮询一次 MongoDB,以了解集合中的任何数据更改。我已使用 Java CompletableFuture.runAsync 来实现此功能,如下面捕获的代码所示。我已经测试运行该程序一天,看起来运行良好。

我的问题是:

  1. 长时间运行是否会存在OOM“堆栈溢出”异常的潜在风险?
  2. 我的线程池大小是3,从日志文件中我发现前几次运行使用的是pool-1-thread-1和pool-1-thread-2,从第三次运行开始依此类推。持续重用pool-1-thread-3一段时间,然后重用pool-1-thread-1/pool-1-thread-2一段时间...是否有任何潜在问题或者是否正常?

    private static ExecutorService executor = Executors.newFixedThreadPool(3);

    private void watch(){
    CompletableFuture<Void> watchForLeadershipChange =
    CompletableFuture.runAsync(() -> pollForChanges(), executor);
    }

    private void pollForChanges() {
    //Query MongoDB collection and do some logic

    TimeUnit.SECONDS.sleep(30);
    watch();
    }

最佳答案

  1. 如果长时间运行会不会有OOM“堆栈溢出”异常的潜在风险?不会。而pollForChanges() 调用 watch(),随后的 pollForChanges() 调用(可能)在另一个线程中异步发生。无论哪种情况,它总是有一个新的堆栈指​​针。
  2. 我的线程池大小是 3,从日志文件中我发现前几个 2 运行...ExecutorService 选择的线程是ExecutorService 的实现细节。您观察到的行为没有任何奇怪或意外的地方。

所有这些都是如此 - 正如评论中指出的那样,这是使用 ScheduledExecutorService 做一些非常琐碎的事情的一种非常迂回的方式:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

scheduler.scheduleWithFixedDelay(
() -> queryMongoAndDoSomeLogic(),
0,
30,
TimeUnit.SECONDS);

关于Java CompletableFuture.runAsync 递归...有潜在风险吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38630174/

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