Java 决定ExecutorService中的线程池计数

Java 决定ExecutorService中的线程池计数,java,multithreading,executorservice,Java,Multithreading,Executorservice,前几天,我需要通过缓存外观从存储库并发访问对象。为此,我决定使用Java并发API中的Executor框架 对于这一点,可以通过web状态的示例使用10个线程初始化ExecutorService,即Executors.newFixedThreadPool(10)。但当我尝试在我的应用程序中对这一数字进行基准测试时,我发现25个线程的性能会更好,而不是更高 所以,问题是10是这个实现的推荐值,或者我可以根据负载选择更好的值。在决定这一点时,需要记住哪些因素 另外,何时选择Executors.New

前几天,我需要通过缓存外观从存储库并发访问对象。为此,我决定使用Java并发API中的Executor框架

对于这一点,可以通过web状态的示例使用10个线程初始化ExecutorService,即Executors.newFixedThreadPool(10)。但当我尝试在我的应用程序中对这一数字进行基准测试时,我发现25个线程的性能会更好,而不是更高

所以,问题是10是这个实现的推荐值,或者我可以根据负载选择更好的值。在决定这一点时,需要记住哪些因素


另外,何时选择Executors.NewsScheduledThreadPool(10)而不是FixedThreadPool impl.

如果您在25时一致地看到更好的性能,则使用25。或者创建具有动态线程计数的。或者只需将其设置为默认值25(或任何值),然后让高级用户选择。至于你关于定时线程池和固定线程池的问题,文档会回答这个问题。谢谢Jason,我会看一看!!线程的数量当然是一个调优参数,“最佳”数量在很大程度上取决于目标系统(它有多少内核)和要执行的实际工作。一般来说,经验法则是线程的数量应该基于。对于非计算密集型任务,更高的数字可能更合适。一个人可以在这里走很远,甚至可以考虑一些“自我调整”来自动找到“甜蜜点”,但这可能不是你要找的。你是对的。。。我的任务不是计算密集型的,如果在缓存外观中找不到大型数据集,则依赖于对数据库的访问。顺便说一句,如何根据处理器的数量计算线程的数量。就像服务器有8个处理器和>20个线程一样,我可以监控并发请求是否疲劳。很抱歉,为了给出一个真正“深刻”的答案,需要对实际设置和任务有非常深入的了解。第一个镜头可能是
numThreads=Runtime.availableProcessors()*2
,但在具有1核或64核的计算机上,这可能是错误的。同样,“最佳”参数可能在许多方面取决于情况。