如何确定在java中创建的合适线程数?

如何确定在java中创建的合适线程数?,java,multithreading,Java,Multithreading,我有一个java应用程序,可以创建远程主机的SSL套接字。我想使用线程来加快进程 我想要不影响程序性能的最大可能利用率。如何确定要使用的合适线程数?运行以下行后:Runtime.getRuntime().availableProcessors()我得了4分。我的处理器是Intel core i7,具有8 GB RAM。如果您有4个内核,那么理论上您应该在任何给定时间都有4个工作线程,以实现最大优化。不幸的是,理论上发生的事情在实践中从未发生过。您可能有工作线程,无论出于何种原因,都有大量的停机时

我有一个java应用程序,可以创建远程主机的SSL套接字。我想使用线程来加快进程


我想要不影响程序性能的最大可能利用率。如何确定要使用的合适线程数?运行以下行后:
Runtime.getRuntime().availableProcessors()我得了4分。我的处理器是Intel core i7,具有8 GB RAM。

如果您有4个内核,那么理论上您应该在任何给定时间都有4个工作线程,以实现最大优化。不幸的是,理论上发生的事情在实践中从未发生过。您可能有工作线程,无论出于何种原因,都有大量的停机时间。也许他们正在上网获取更多的数据,或者从磁盘上读取数据,而这些数据中的大部分只是等待而没有使用cpu

根据你等待的时间,你会想要增加这个数字。增加线程数量的代价是您将有更多的上下文切换和资源竞争。这样做的好处是,如果其他线程中的一个决定它必须中断,那么您将有另一个线程准备好工作

你最好的办法是把它设为某个值(让我们从4开始),然后逐步提高。使用每个设置评测代码,看看基准测试是上升还是下降。你很快就会看到一个模式和盈亏平衡点


当谈到优化时,你可以将你想要的一切理论化为什么应该是最快的,但要真正回答这个问题,你不能比实际运行和计时你的代码更好。

正如DarthVader所说,你可以使用线程池(
CachedThreadPool
)。使用此构造,您不必指定具体的线程数

从网站:

  • newCachedThreadPool方法使用可扩展的线程池创建执行器。此执行器适用于启动许多短期任务的应用程序
也许这就是你要找的。
关于核心的数量很难说。您有4个超线程内核,至少有一个内核应该留给操作系统。我想应该是4-6个线程。

@DarthVader我想问题是:什么尺寸?@DarthVader:我已经在使用pool了。但是我应该在池中定义多少线程?我如何知道哪个号码适合我的电脑?是的,你有两个选择,你可以创建一个固定的线程池,大小与你的机器中的核心数相同。或者您可以有一个线程池,根据需要创建更多线程。本质上,您不应该担心内核的数量和需要创建的线程的数量。有很多因素会影响线程切换,虽然存在线程切换,但其他线程可以利用CPU。因此,每个核心一个线程并不能很好地应用。同样相关:@assylias我不同意这一点。理论上的最大值是每个内核正好有一个线程可以运行。我将更新以澄清区别。我理解你的意思-我误读了“线程运行”和理解了“线程活动”。我同意你的回答。动态调整池大小有什么建议吗?