Java CompletableFuture.runAsync recurrsion ...任何潜在的风险?

时间:2016-07-28 07:49:22

标签: java multithreading mongodb

我的要求是每隔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 ...会不会有任何潜在的问题或是否正常?< / p>

    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 个答案:

答案 0 :(得分:1)

  1. 是否存在任何潜在的OOM风险和#34;堆栈溢出&#34;如果我长时间运行会出现异常? 否。pollForChanges()调用watch()时,pollForChanges()的后续调用会在(可能)另一个线程中异步发生。在任何一种情况下,它总是会有一个新的堆栈指​​针。
  2. 我的线程池大小为3,从日志文件中我发现前两个运行... ExecutorService选择的哪个线程是一个实现细节ExecutorService。你正在观察的行为没有什么奇怪或意外的。
  3. 所有这一切 - 这是一种非常迂回的方式,用ScheduledExecutorService做一些非常微不足道的事情,正如评论中所指出的那样:

    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    
    scheduler.scheduleWithFixedDelay(
            () -> queryMongoAndDoSomeLogic(),
            0,
            30,
            TimeUnit.SECONDS);