Java线程对象

Java线程对象,java,multithreading,Java,Multithreading,我创建了一个大小为1000的数组对象,它们都是线程化的,这意味着添加了1000个线程。每个对象包含一个套接字和另外9个全局变量。整个对象由1000行代码组成 我正在寻找使该计划有效的方法,因为它滞后。每次启动程序时,CPU的使用率都是100% 我知道我将不得不改变程序的工作方式,但我找不到一个好办法。有人能解释一下如何实现这一点吗?1/使用线程池 2/使用未来1/使用线程池 2/使用未来这取决于线程实际执行的任务-任务主要使用CPU还是其他资源?对于CPU密集型任务,最好的策略是运行尽可能多的线

我创建了一个大小为1000的数组对象,它们都是线程化的,这意味着添加了1000个线程。每个对象包含一个套接字和另外9个全局变量。整个对象由1000行代码组成

我正在寻找使该计划有效的方法,因为它滞后。每次启动程序时,CPU的使用率都是100%

我知道我将不得不改变程序的工作方式,但我找不到一个好办法。有人能解释一下如何实现这一点吗?

1/使用线程池

2/使用未来

1/使用线程池


2/使用未来

这取决于线程实际执行的任务-任务主要使用CPU还是其他资源?对于CPU密集型任务,最好的策略是运行尽可能多的线程,或者更多。对于大量阻塞的线程,例如读取文件、等待网络等。您可以拥有比CPU多得多的线程

这还取决于系统有多少核。显然,单处理器机器的答案与128路多处理器机器的答案截然不同。上面的经验法则可以为您提供一些估计,但最好是自己根据这些经验进行实验,以确定特定设置的理想线程数


此外,自Java5以来,最好使用例如a,而不是手动创建线程。这使你的应用程序更健壮、更灵活。

这取决于你的线程实际做什么——任务主要使用CPU还是其他资源?对于CPU密集型任务,最好的策略是运行尽可能多的线程,或者更多。对于大量阻塞的线程,例如读取文件、等待网络等。您可以拥有比CPU多得多的线程

这还取决于系统有多少核。显然,单处理器机器的答案与128路多处理器机器的答案截然不同。上面的经验法则可以为您提供一些估计,但最好是自己根据这些经验进行实验,以确定特定设置的理想线程数


此外,自Java5以来,最好使用例如a,而不是手动创建线程。这使得你的应用程序更加健壮和灵活。

你应该考虑重构你对线程的使用。

在普通机器/服务器上,1000个线程通常没有意义,尽管您的问题似乎是I/O问题。您应该考虑可用的CPU线程数。< /P>

一个可能的解决方案是使用一个调度器,它将处理(和可能的响应)传递给套接字上的请求,进入一个<代码>线程线程执行器> />代码队列。

您应该考虑重构线程的使用。 在普通机器/服务器上,1000个线程通常没有意义,尽管您的问题似乎是I/O问题。您应该考虑可用的CPU线程数。< /P>
一个可能的解决方案是使用一个调度程序,将套接字上请求的处理(以及可能的响应)传递到
线程池执行器的队列中。根据我的经验,1000个线程太多了(至少在8core/8GB RAM机器上)。一个常见的症状是上下文切换slashing,操作系统只是忙于从一个线程跳到另一个线程,而很少做有用的工作(并且浪费了大量内存等等)

如果您必须维护1000个套接字,那么您可能必须使用NIO。更简单的解决方法是每次都关闭/打开插座(是否可以这样做取决于您的工作特点)


正如其他人所指出的,解决这个多线程问题的方法是使用线程池。与其扩展线程,不如编写一个可运行的代码。这说起来容易做起来难,因为如果你需要谈话,你必须保持状态。这通常涉及一个
ConcurrentMap
。我个人倾向于在这个映射上放置一个处理程序(实现Runnable),当对方返回响应(每次响应都包含一个键)时,该处理程序应该运行。在这种情况下,每次都要关闭插座。如果您使用NIO,它更像是用线程编码,因为您不需要像这样识别对方,但它有其自身的复杂性。

根据我的经验,1000个线程太多了(至少在8core/8GB RAM机器上)。一个常见的症状是上下文切换slashing,操作系统只是忙于从一个线程跳到另一个线程,而很少做有用的工作(并且浪费了大量内存等等)

如果您必须维护1000个套接字,那么您可能必须使用NIO。更简单的解决方法是每次都关闭/打开插座(是否可以这样做取决于您的工作特点)


正如其他人所指出的,解决这个多线程问题的方法是使用线程池。与其扩展线程,不如编写一个可运行的代码。这说起来容易做起来难,因为如果你需要谈话,你必须保持状态。这通常涉及一个
ConcurrentMap
。我个人倾向于在这个映射上放置一个处理程序(实现Runnable),当对方返回响应(每次响应都包含一个键)时,该处理程序应该运行。在这种情况下,每次都要关闭插座。如果你使用NIO,它更像是用线程编码,因为你不需要像这样识别对手,但它有它自己的复杂性。

我认为“1000个线程”和“CPU使用率为100%”这两个短语很好地结合在一起。您可能需要重新考虑一下您的设计……我认为“1000个线程”和“CPU使用率为100%”这两个短语很好地结合在一起。你可能想重新考虑一下你的设计……有趣。未来确实很有帮助。大多数情况下,可以通过定期执行的一系列操作来替换多个线程,未来和合适的执行者就要来了。未来确实很有帮助。大多数时候,这是可能的