我的要求是每隔30秒轮询一次MongoDB以查看集合中的任何数据更改。我使用Java CompletableFuture.runAsync来实现此功能,如下面捕获的代码。我已经测试了一天的程序,看起来工作正常。
我的问题是:
我的线程池大小是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();
}
答案 0 :(得分:1)
pollForChanges()
调用watch()
时,pollForChanges()
的后续调用会在(可能)另一个线程中异步发生。在任何一种情况下,它总是会有一个新的堆栈指针。ExecutorService
选择的哪个线程是一个实现细节ExecutorService
。你正在观察的行为没有什么奇怪或意外的。所有这一切 - 这是一种非常迂回的方式,用ScheduledExecutorService
做一些非常微不足道的事情,正如评论中所指出的那样:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleWithFixedDelay(
() -> queryMongoAndDoSomeLogic(),
0,
30,
TimeUnit.SECONDS);