我想知道,在java 1.6 x64中让许多线程处于等待状态是多么昂贵.
更具体地说,我正在编写跨越许多计算机的应用程序,并将数据从一个计算机发送到另一个计算机.我觉得为每台连接的机器和任务分别设置单独的线程感觉更舒服,例如1)发送数据,2)接收数据,3)删除时重新建立连接.因此,假设集群中有N个节点,则每台机器将为N-1个邻居中的每个节点设置3个线程.通常会有12台机器,它们来自33个通信线程.
这些线程中的大多数将在大多数时间处于休眠状态,因此出于优化目的,我可以减少线程数并为每个线程提供更多工作.比如,例如.重新建立连接是接收线程的责任.或者通过单线程发送到所有连接的机器.
因此,对于拥有许多睡眠线程是否有任何显着的性能影响?
对于大多数情况,睡眠线程消耗的资源将是其堆栈空间.我认为使用2-threads-per-connection-model类似于你所描述的模型,当连接数量增大时,由于这个原因,会导致很大的可伸缩性问题.
我自己一直处于这种情况,当连接数超过500个连接(大约一千个线程)时,你会遇到很多情况,你会得到OutOfMemoryError,因为线程堆栈的空间使用超过了最大数量单个进程的内存.至少在我们的情况下,这是在32位Windows世界的Java中.我猜你可以调整一些东西并进一步调整,但最后它只是不太可扩展,因为你浪费了大量的内存.
如果您需要大量连接,Java NIO(新IO或其他)是可行的方法,可以在同一个线程中处理大量连接.
话虽如此,你不应该在一个相当现代的服务器上遇到100个线程的问题,即使它可能仍然是浪费资源.