2012-07-09 24 views
2

我有一个Java应用程序与远程主机创建SSL套接字。我想用线程来加速这个过程。如何决定在java中创建合适的线程数量?

我希望不影响程序性能的最大可能利用率。我怎样才能决定合适的线程数量?运行以下行后:Runtime.getRuntime().availableProcessors();我得到了4.我的处理器是英特尔核心i7,具有8 GB RAM。

+4

使用线程池。 – DarthVader 2012-07-09 22:09:16

+1

@DarthVader我认为问题是:什么大小? – assylias 2012-07-09 22:10:50

+2

@DarthVader:我已经在使用池。但是我应该在池中定义多少个线程?我怎么知道哪个号码适合我的电脑? – 2012-07-09 22:12:29

回答

1

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

根据你在做多少等待,你会想要提高数字。增加线程数量的成本是您将有更多的上下文切换和资源竞争。好处是你将有另一个线程准备好工作,以防其他线程决定必须为某些事情做出决定。

最好的办法是把它设置成某种东西(让我们从4开始),然后继续前进。使用各种设置对您的代码进行分析,然后查看您的基准测试结果是否升高或降低。你应该很快看到一个模式和盈亏平衡点。

当谈到优化,可以推论所有你想了解应该是最快的,但你不会打实际运行和定时代码,以真正回答这个问题。

+0

...你应该有**至少**四个工作者线程... – assylias 2012-07-09 22:19:49

+1

@assylias我不同意这一点。理论上的最大值是每个核心只有一个线程在运行。我会更新以澄清区别。 – corsiKa 2012-07-09 22:22:35

+0

我明白你的意思 - 我误读了“线程正在进行”并理解“线程活着”。我同意你的回答。 – assylias 2012-07-09 22:24:27

0

正如达斯·维达说,你可以使用一个线程池(CachedThreadPool)。使用这个构造,你不必指定具体的线程数量。

从​​网站:

  • 的newCachedThreadPool方法创建一个可扩展的线程池的执行者。该执行程序适用于启动许多短期任务的应用程序。

也许这是你在找什么。 关于内核的数量很难说。你有4个超线程核心,至少有一个核心,你应该离开你的操作系统。我会说4-6线程。