3

我正在用java开发一个软件,它在接收到一个事件(来自传感器)时创建一个线程。这些线程的生存时间非常短(< 1 秒)
传感器每分钟最多发送 10 个事件。 这个应用程序大部分时间都可以正常工作。但有时它会挂起。
我查看了eclipse调试器,发现有很多线程,其中大多数是"Thread[garbage collected]"(大约800个线程@_@)

我不知道该错误是由我的代码中的动态创建线程还是其他错误引起的?

EDIT:
该问题确实是由创建太多线程引起的。我已经用时间戳记录了所有传感器的事件,并且它创建了一些关于1200 events/minute(该死的!)的点。
我还编写了一个小型 Java 程序,它可以创建尽可能多的线程。在~4100th thread(嗯,木制计算机),jvm 崩溃。它不像我的应用程序那样挂起:-?。
因此,我认为在动态创建线程时存在(可能)罕见的情况,它会导致垃圾收集线程挂起?

在此处输入图像描述

4

2 回答 2

11

不要为每个收到的事件创建一个新线程。相反,请使用java.util.concurrent包中的类。

创建一个ExecutorService(使用类中的静态方法之一Executors)并将用于处理事件的作业提交给ExecutorService. 这ExecutorService是一个为您管理线程的线程池。

于 2013-07-23T11:24:27.263 回答
1

我在 NetBeans 中遇到了类似的问题。一段时间后,程序会挂起很多(可能是 500 个)挂起的线程。但是,当在调试器之外运行时,它工作得很好。我认为我在户外运行时不会同时运行超过几百个线程,但是该程序确实倾向于以惊人的速度启动它们。我怀疑调试器从不关闭线程,只能处理这么多线程。

到目前为止,我的经验是 JVM 可以很好地处理大量快速启动和停止线程,但 NetBeans 调试器(现在有几个版本,现在是 6 版本之一)没有。

于 2013-07-23T16:16:43.590 回答