WorkManager和高工作量

时间:2010-08-01 09:06:38

标签: java multithreading high-load

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

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

谢谢!

4 个答案:

答案 0 :(得分:1)

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

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

ThreadPoolExecutor是你应该使用的类。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果这确实是一个绝对的要求,你可能不会看一下专门用来处理这种级别的并发线程的语言,比如erlang。

答案 3 :(得分:0)

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

对于网络,如果您的应用使用的是HTTP,那么这个领域的2位非常着名的作者就会有一个非常简单的工具Async-HTTP-client

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