2

我正在开发一个与网络上数百个设备交互的应用程序。提交的工作类型需要大量并发线程(主要是因为它们中的每一个都需要网络交互并且单独进行,但也有其他原因)。目前,我们处于每个交互设备需要大约 20-30 个线程的领域。

一个简单的计算将它放在数千个线程上,甚至多达 10,000 个线程。如果我们抛开线程切换等 CPU 代价,在 CentOS 64 位上运行的 Java 5 可以处理多少个线程?这只是 RAM 的问题还是我们应该考虑其他什么?

谢谢!

4

4 回答 4

1

在这种情况下,总是建议使用线程池。

线程池解决了两个不同的问题:由于减少了每个任务的调用开销,它们通常在执行大量异步任务时提供改进的性能,并且它们提供了一种限制和管理资源的方法,包括执行一组线程时消耗的线程。任务。每个 ThreadPoolExecutor 还维护一些基本的统计信息,例如完成任务的数量。

ThreadPoolExecutor 是您应该使用的类。

http://www.javamex.com/tutorials/threads/ThreadPoolExecutor.shtml

于 2010-08-01T09:15:51.550 回答
0

我认为 java 最多可以使用 65k 线程,您唯一需要考虑的是堆栈空间 - linux 默认情况下为每个线程/进程分配 48k 作为堆栈空间,这对于 java(没有堆栈分配的对象)来说是浪费的,因此使用更少的堆栈空间)。这将很容易将 500 兆用于 10k 线程。

于 2010-08-01T09:42:18.307 回答
0

如果这确实是一个绝对要求,您可能不想查看专门为处理这种级别的并发线程而构建的语言,例如 erlang。

于 2010-08-01T09:45:13.107 回答
0

就像其他人建议的那样,您应该使用 NIO。我们有一个应用程序使用了很多(但比您计划的要少得多)线程(例如 1,000 )并且它已经非常低效。如果你必须使用那么多线程,那么绝对是时候考虑使用 NIO 了。

对于网络,如果您的应用程序使用 HTTP,那么一个非常简单的工具就是Async-HTTP-client由该领域的 2 位非常著名的作者编写。

如果您使用不同的协议,建议使用 Async-HTTP-client ( netty ) 的底层实现。

于 2010-08-01T15:14:41.607 回答