主线程接收数据,收到数据后调用start()方法开一个线程去处理,start()方法里会根据不同的数据进行不同的处理,但主要操作就是数据库操作,用的是hibernate,但在finally里都有close连接操作。所有处理程序都是立即返回的(不需要等待)。但我在并发很大时,就是主线程不断的接收数据时,发现Thread.activeCount()达到几千,为什么呢?如果子线程处理完了就结束了这个计数不就减1么,我自己写了个小的Test程序,就没有这个问题,而且在top(linux OS)下发现java占的CPU特别大,但内存并不是特别大。这大概是怎么回事呢?
=========================
也不是立即返回啊,但至少是实时的,多线程只是为了效率,打开和关闭一个连接有什么关系?这是应用需要,必需的。为什么用多线程不理想?
至于CPU占用特别大原因就在这,线程的管理、切换、以及运行完的线程对象的回收都是要耗cpu的,楼主可以看一下操作系统的书就明白了
至于CPU占用大,那是因为你的线程执行数多,有东西要执行当然CPU就要执行了,也许你的程序就是相当耗CPU,不过楼上说的也是很有可能。
你的每个线程都在finally里关闭了边接,下次启动线程的话,不是还要连接吗???
主线程不断的接收数据,不停的开线程,当然会Thread.activeCount()达到几千
至于CPU占用特别大原因就在这,线程的管理、切换、以及运行完的线程对象的回收都是要耗cpu的,楼主可以看一下操作系统的书就明白了
==========================================
不断的接收数据,不断的开线程,如果线程永远无法结束那activeCount达到几千是正常的,但是我其实每个线程都是在相对较短的时间内会结束的,那结束的话activeCount也会跟着减少,最极端的情况下是我一下接收到1000笔数据,开了1000次线程,但如果我所有的数据在一个时间段内都处理并结束后,那么它的activeCount应该是最初没有接收到数据时一样,但事实上在等了很久很久后(我的数据肯定都处理完了)activeCount还是不减。这是什么原因呢?
to frilly(秋◆水) :
你不是每个线程都打开一次数据库吧?
====================================
数据库操作是用的hibernate,每次表操作都是重新得到一个session,但不同的数据处理需要操作不同的表,如果这个session可以只进行一次获取的话,但这样做会不会有什么问题呢?另外我用如下的程序打出线程信息:
int total=Thread.activeCount();
Thread[] totalThread=new Thread[total];
int length=Thread.enumerate(totalThread);
System.out.println("当前线程组中线程数:" + total);
for(int i=0;i<length;i++)
{
System.out.println(totalThread[i].getName());
} 出现这样的结果:当前线程组中线程数:240
main
Thread-26
Thread-55
Thread-64
Thread-466为什么明显有240个线程,却只有五个线程名字可以得到呢?我在一个简单的测试程序里得到的是
Thread.activeCount()的值与Thread.enumerate(totalThread); 的返回值一致的。