2010-08-22 68 views
0

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

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

我知道我将不得不改变程序的工作方式,但我找不到一个好方法。任何人都可以解释如何做到这一点?

+2

我认为短语“1000线程”和“CPU使用率为100%”一起走得很好。您可能需要重新考虑您的设计... – Starkey 2010-08-22 22:17:41

回答

0

1 /使用线程池

2 /利用期货

+0

线程池+1,但期货为-1。期货在这里没有帮助.. – 2010-08-22 23:42:03

+0

好笑。期货确实帮了很大忙。大多数情况下,可以通过定期执行的动作序列来替换多个线程,这里的期货和适当的执行者即将到来。 – Moisei 2010-08-24 00:24:34

3

这取决于你的线程实际上做 - 是的任务主要使用CPU或其他资源?对于CPU密集型任务,最好的策略是运行与核心一样多的线程,或者更多。对于例如阻塞很多的线程,读取文件,等待网络等等,你可以拥有比CPU更多的线程。

它也取决于系统有多少个核心。显然,单个处理器机器的答案与128路多处理器的答案不同。上述经验法则可以给你一些估计值,但最好基于这些来做实验,找出理想的特定设置的线程数。

此外,自Java5以来,总是建议使用例如一个ThreadPoolExecutor而不是手动创建你的线程。这使您的应用更健壮,更灵活。

0

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

1000虽然您的问题似乎是I/O繁重,但在正常的机器/服务器上,线程通常没有意义。您应该考虑可用的cpu线程数。

一个可能的解决方案是使用一个调度程序,它将套接字上的请求的处理(可能是响应)传递到ThreadPoolExecutor的队列中。

0

从我的经验来看,1000个线程太多了(至少在8核/ 8GB内存的机器上)。一个常见的症状是上下文切换斜杠,其中您的操作系统正忙于从一个线程跳到另一个线程,同时做一些有用的工作(并浪费大量内存等)。

如果您必须维护 1000个套接字,您可能必须去NIO。更容易的出路是每次关闭/打开套接字(无论你是否可以依赖于你的工作特征来做这件事)。

你解决这么多线程问题的方式是使用线程池,就像其他人注意的那样。代替扩展线程,代码是一个Runnable。这说起来容易做起来难,但是因为如果你需要谈话,你必须保持状态。这通常涉及ConcurrentMap。我个人倾向于在该地图上放置一个Handler(它实现了Runnable),该地图应该在对方返回响应时响应(响应每次都包含一个键)。在这种情况下,您每次都会关闭套接字。如果您使用NIO,则更像是使用线程进行编码,因为您不需要识别此类对手方,但它有其自身的复杂性。