我有一个在生产中运行的 Spring boot 应用程序。我正在实现一个异步功能,该功能导出可以在其单独的线程池上运行的特定指标,而不会阻塞主应用程序线程。我只是在想如何决定我需要多少个线程? 我正在使用 Java 并为此使用 ExecutionrService。
ExecutorService executorService = Executors.newFixedThreadPool(5);
您评论说您的后台任务不受 CPU 限制,它们确实涉及阻塞,例如文件 I/O、日志记录、网络调用、访问数据库等。
在这种情况下,您应该考虑在 Java 21+ 中使用虚拟线程(纤维)。使用“此执行程序服务”实现时,将为您提交的每个任务创建一个新的虚拟线程。当您的任务结束时,线程也结束。虚拟线程在内存和 CPU 方面是如此“便宜”,以至于您可以合理地让数百万个线程在传统硬件上同时运行。 因此,当使用虚拟线程时,您的问题在这里变得毫无意义。
搜索 Stack Overflow 以了解更多信息,因为虚拟线程已被多次提及。另请参阅 Ron Pressler、Alan Bateman 和 José Paumard 的精彩视频演讲。