我正在开发一个与网络上数百个设备交互的应用程序。提交的工作类型需要大量并发线程(主要是因为它们中的每一个都需要网络交互并且单独进行,但也有其他原因)。目前,我们处于每个交互设备需要大约 20-30 个线程的领域。
一个简单的计算将它放在数千个线程上,甚至多达 10,000 个线程。如果我们抛开线程切换等 CPU 代价,在 CentOS 64 位上运行的 Java 5 可以处理多少个线程?这只是 RAM 的问题还是我们应该考虑其他什么?
谢谢!
我正在开发一个与网络上数百个设备交互的应用程序。提交的工作类型需要大量并发线程(主要是因为它们中的每一个都需要网络交互并且单独进行,但也有其他原因)。目前,我们处于每个交互设备需要大约 20-30 个线程的领域。
一个简单的计算将它放在数千个线程上,甚至多达 10,000 个线程。如果我们抛开线程切换等 CPU 代价,在 CentOS 64 位上运行的 Java 5 可以处理多少个线程?这只是 RAM 的问题还是我们应该考虑其他什么?
谢谢!
在这种情况下,总是建议使用线程池。
线程池解决了两个不同的问题:由于减少了每个任务的调用开销,它们通常在执行大量异步任务时提供改进的性能,并且它们提供了一种限制和管理资源的方法,包括执行一组线程时消耗的线程。任务。每个 ThreadPoolExecutor 还维护一些基本的统计信息,例如完成任务的数量。
ThreadPoolExecutor 是您应该使用的类。
http://www.javamex.com/tutorials/threads/ThreadPoolExecutor.shtml
我认为 java 最多可以使用 65k 线程,您唯一需要考虑的是堆栈空间 - linux 默认情况下为每个线程/进程分配 48k 作为堆栈空间,这对于 java(没有堆栈分配的对象)来说是浪费的,因此使用更少的堆栈空间)。这将很容易将 500 兆用于 10k 线程。
如果这确实是一个绝对要求,您可能不想查看专门为处理这种级别的并发线程而构建的语言,例如 erlang。
就像其他人建议的那样,您应该使用 NIO。我们有一个应用程序使用了很多(但比您计划的要少得多)线程(例如 1,000 )并且它已经非常低效。如果你必须使用那么多线程,那么绝对是时候考虑使用 NIO 了。
对于网络,如果您的应用程序使用 HTTP,那么一个非常简单的工具就是Async-HTTP-client由该领域的 2 位非常著名的作者编写。
如果您使用不同的协议,建议使用 Async-HTTP-client ( netty ) 的底层实现。