日期:2014-05-20  浏览次数:20837 次

多线程问题(Thread.activeCount()很大)
主线程接收数据,收到数据后调用start()方法开一个线程去处理,start()方法里会根据不同的数据进行不同的处理,但主要操作就是数据库操作,用的是hibernate,但在finally里都有close连接操作。所有处理程序都是立即返回的(不需要等待)。

但我在并发很大时,就是主线程不断的接收数据时,发现Thread.activeCount()达到几千,为什么呢?如果子线程处理完了就结束了这个计数不就减1么,我自己写了个小的Test程序,就没有这个问题,而且在top(linux   OS)下发现java占的CPU特别大,但内存并不是特别大。这大概是怎么回事呢?

------解决方案--------------------
如果是立即返回为什么要启用多个线程呢,另外每一个线程都打开和关闭一个连接,且在可预知的情况下并发很多,那这种条件下还用多线程就更不理想了。而cpu的高占用问题也肯定与这个有关
------解决方案--------------------
如果是立即返回为什么要启用多个线程呢,另外每一个线程都打开和关闭一个连接,且在可预知的情况下并发很多,那这种条件下还用多线程就更不理想了。而cpu的高占用问题也肯定与这个有关
=========================
也不是立即返回啊,但至少是实时的,多线程只是为了效率,打开和关闭一个连接有什么关系?这是应用需要,必需的。为什么用多线程不理想?
------解决方案--------------------
主线程不断的接收数据,不停的开线程,当然会Thread.activeCount()达到几千
至于CPU占用特别大原因就在这,线程的管理、切换、以及运行完的线程对象的回收都是要耗cpu的,楼主可以看一下操作系统的书就明白了
------解决方案--------------------
楼主即然提到主线程接收数据,收到数据后调用start()方法开一个线程去处理,主线程不断的接收数据时,就会有很多的线程执行,你说所有处理程序都是立即返回的(不需要等待), 是不是说没有制约的条件,如果是这样的话,那就有可能你的线程还没有执行完,这时的线程数也就不会少
至于CPU占用大,那是因为你的线程执行数多,有东西要执行当然CPU就要执行了,也许你的程序就是相当耗CPU,不过楼上说的也是很有可能。
------解决方案--------------------
如果在这里不能得到满意回答,请尝试到IT付费问答社区www.nlld.net提问
------解决方案--------------------
你不是每个线程都打开一次数据库吧?