我有一个Java应用程序与远程主机创建SSL套接字。我想用线程来加速这个过程。如何决定在java中创建合适的线程数量?
我希望不影响程序性能的最大可能利用率。我怎样才能决定合适的线程数量?运行以下行后:Runtime.getRuntime().availableProcessors();
我得到了4.我的处理器是英特尔核心i7,具有8 GB RAM。
我有一个Java应用程序与远程主机创建SSL套接字。我想用线程来加速这个过程。如何决定在java中创建合适的线程数量?
我希望不影响程序性能的最大可能利用率。我怎样才能决定合适的线程数量?运行以下行后:Runtime.getRuntime().availableProcessors();
我得到了4.我的处理器是英特尔核心i7,具有8 GB RAM。
如果您有4个内核,那么从理论上讲,您应该在任何给定时间都有四个工作线程进行最大限度的优化。不幸的是理论上发生的事情在实践中从未发生您可能有工人线程,无论出于何种原因,他们都有大量的停机时间。也许他们正在网上寻找更多的数据,或者从磁盘读取数据,其中很多数据只是在等待而不使用cpu。
根据你在做多少等待,你会想要提高数字。增加线程数量的成本是您将有更多的上下文切换和资源竞争。好处是你将有另一个线程准备好工作,以防其他线程决定必须为某些事情做出决定。
最好的办法是把它设置成某种东西(让我们从4开始),然后继续前进。使用各种设置对您的代码进行分析,然后查看您的基准测试结果是否升高或降低。你应该很快看到一个模式和盈亏平衡点。
当谈到优化,可以推论所有你想了解应该是最快的,但你不会打实际运行和定时代码,以真正回答这个问题。
正如达斯·维达说,你可以使用一个线程池(CachedThreadPool
)。使用这个构造,你不必指定具体的线程数量。
从网站:
也许这是你在找什么。 关于内核的数量很难说。你有4个超线程核心,至少有一个核心,你应该离开你的操作系统。我会说4-6线程。
使用线程池。 – DarthVader 2012-07-09 22:09:16
@DarthVader我认为问题是:什么大小? – assylias 2012-07-09 22:10:50
@DarthVader:我已经在使用池。但是我应该在池中定义多少个线程?我怎么知道哪个号码适合我的电脑? – 2012-07-09 22:12:29