本帖最后由 sinat_25338313 于 2015-01-15 09:35:47 编辑

解决方案 »

  1.   

    processData(socket,strRead); 这个方法 结束了没有。  贴出来看看。
    还有你说的自定义线程池是自己写的?还是JAVA自带的那个。
      

  2.   


    private void processData(Socket socket,String str){
    try{
    //System.out.println("--2");
    //String strReceive = str;
    if (str != null){
    if(!str.contains("heart")){
    if(getDeviceIdAndType(str,socket)==1){
        //开始解析数据
    //System.out.println("--3");
        ProcessThread ph = new ProcessThread();
        ph.run(str);
       }

       }
    }
    }catch (Exception e)
    {
    e.printStackTrace();
    Thread.interrupted();
    errorLog.error("截取数据异常"+e.toString());
    }
    }
    里边的是数据库操作,我有跟踪,正常的时候是都处理完了。就是运行一段时间以后,处理数据线程就不再执行了。
      

  3.   


    private ThreadPoolExecutor pools = new ThreadPoolExecutor(20, 1000, 20000, 
              TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1000), new ThreadPoolExecutor.DiscardPolicy() );
    这是线程池
      

  4.   

    首先这个线程池写的不咋地啊,最大线程数量和队列长度的1000都太大了,你这个线城池应该绝大部分时间都是20个线程在运行,不管有多少个请求,不信你看看。另外,你这个连接时候长连接吗?如果是长连接的话,超过20个客户端,你这个线程池基本都阻塞了。你可以把那两个1000先调小看看new ThreadPoolExecutor(20, 60, 20000, 
                     TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10), new ThreadPoolExecutor.DiscardPolicy() );
      

  5.   

    另外做socket的服务端,尤其是长连接的,做好用nio,框架就是mina和netty都挺好使的,楼主可以试试
      

  6.   


    我是个新手,刚开始工作。为什么长连接超过20个客户端就阻塞了呢?能解释一下吗,谢谢~~
     java中的socket的读是带阻塞的,如果没有东西可读又没有关闭连接的话,线程就卡在读这里了
      

  7.   

    分析一下希望对你有帮助  不管你用什么池(线程池,链接池)都记住要关闭流或者关闭链接,开始你写了一个while (true) 这里是一个死循环 没有跳出的条件 ,所以不停的接受数据,直至线程池满复核。所以通过你给出的代码给两点意见吧。
    1.关流;
    2.跳出循环条件。试试看(此分析只是个人研究你给出的代码的看法)