Java 工作经理和高工作负荷

Java 工作经理和高工作负荷,java,multithreading,high-load,Java,Multithreading,High Load,我正在开发一个通过网络与数百台设备交互的应用程序。提交的工作类型需要很多并发线程(主要是因为每个线程都需要网络交互,并且是单独进行的,但也有其他原因)。目前,我们正处于每个交互设备需要20-30个线程的领域 一个简单的计算就是数千个线程,甚至多达10000个线程。如果我们把线程切换等的CPU代价放在一边,那么在CentOS 64位上运行的Java 5可以处理多少线程?这只是公羊的问题,还是我们还有什么要考虑的? 谢谢 在这种情况下,总是建议使用线程池 线程池解决了两个不同的问题:它们通常在执行大

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

一个简单的计算就是数千个线程,甚至多达10000个线程。如果我们把线程切换等的CPU代价放在一边,那么在CentOS 64位上运行的Java 5可以处理多少线程?这只是公羊的问题,还是我们还有什么要考虑的?
谢谢

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

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

ThreadPoolExecutor是您应该使用的类


< /P> < P>我认为,在java中,最多可以使用65字节线程,只需要考虑堆栈空间——默认情况下Linux分配每个线程/进程的48 K作为堆栈空间,这对于java(不具有堆栈分配对象,因此使用更少的堆栈空间)是浪费的。这将很容易为10k线程使用500兆。

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

像其他人建议的那样,您应该使用NIO。我们有一个应用程序,它使用了很多(但比你计划的要少得多)线程(例如1000个),而且它已经非常低效了。如果你必须使用这么多线程,那么绝对是考虑使用NiO的时候了。p> 对于网络,如果您的应用程序使用HTTP,一个非常简单的工具将是该领域两位非常著名的作者


如果使用不同的协议,建议使用异步HTTP客户机()的底层实现

实际上,正在使用线程池。这是由于正在进行的网络I/O的数量而同时需要的线程数。@那么,您的意思是要打开到单个设备的多个套接字连接吗?在这种情况下,您还需要对单个设备进行连接池,以限制每个设备的套接字数量。通常套接字限制的数量取决于文件系统可用的inode的数量。如果您有20-30个设备连接,尝试使用NIO与设备交互-这将使每个设备减少到1到2个线程-并将线程计数减少到可管理的水平。我完全同意使用NIO。我们不能使用NIO-这是因为通信由不使用NIO的第三方库处理。遗憾的是,目前我们没有比这个第三方库更好的选择。如果您认为“大量网络I/O”[sic]意味着同时需要大量线程,那么您就大错特错了,正如您对YoK所评论的那样。有很多系统在不使用数千个线程的情况下产生和消耗大量的网络I/O。@NoozNooz42 10k连接是一个巨大的数量,当然不是琐碎的线程,即使它以前做过。@NoozNooz42不是NIO(我在下面评论过,这对我们来说是不可能的),并且给定了网络IO(以及在远程服务器上的处理)需要很长时间,如何实现更好的性能?我们不能使用NIO-这是因为通信由不使用NIO的第三方库处理。遗憾的是,目前我们没有比该第三方库更好的选择。