主线程接收数据,收到数据后调用start()方法开一个线程去处理,start()方法里会根据不同的数据进行不同的处理,但主要操作就是数据库操作,用的是hibernate,但在finally里都有close连接操作。所有处理程序都是立即返回的(不需要等待)。但我在并发很大时,就是主线程不断的接收数据时,发现Thread.activeCount()达到几千,为什么呢?如果子线程处理完了就结束了这个计数不就减1么,我自己写了个小的Test程序,就没有这个问题,而且在top(linux OS)下发现java占的CPU特别大,但内存并不是特别大。这大概是怎么回事呢?

解决方案 »

  1.   

    如果是立即返回为什么要启用多个线程呢,另外每一个线程都打开和关闭一个连接,且在可预知的情况下并发很多,那这种条件下还用多线程就更不理想了。而cpu的高占用问题也肯定与这个有关
      

  2.   

    如果是立即返回为什么要启用多个线程呢,另外每一个线程都打开和关闭一个连接,且在可预知的情况下并发很多,那这种条件下还用多线程就更不理想了。而cpu的高占用问题也肯定与这个有关
    =========================
    也不是立即返回啊,但至少是实时的,多线程只是为了效率,打开和关闭一个连接有什么关系?这是应用需要,必需的。为什么用多线程不理想?
      

  3.   

    主线程不断的接收数据,不停的开线程,当然会Thread.activeCount()达到几千
    至于CPU占用特别大原因就在这,线程的管理、切换、以及运行完的线程对象的回收都是要耗cpu的,楼主可以看一下操作系统的书就明白了
      

  4.   

    楼主即然提到主线程接收数据,收到数据后调用start()方法开一个线程去处理,主线程不断的接收数据时,就会有很多的线程执行,你说所有处理程序都是立即返回的(不需要等待), 是不是说没有制约的条件,如果是这样的话,那就有可能你的线程还没有执行完,这时的线程数也就不会少
    至于CPU占用大,那是因为你的线程执行数多,有东西要执行当然CPU就要执行了,也许你的程序就是相当耗CPU,不过楼上说的也是很有可能。
      

  5.   

    如果在这里不能得到满意回答,请尝试到IT付费问答社区www.nlld.net提问
      

  6.   

    一次打开,最后再关闭,
    你的每个线程都在finally里关闭了边接,下次启动线程的话,不是还要连接吗???
      

  7.   

    to : lm_pla(日光月光):
     主线程不断的接收数据,不停的开线程,当然会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); 的返回值一致的。