現在在做一個多線程Socket通信問題﹐現在在接受數據端老是過2到3個小時就有一條線程死掉﹐例外還有兩個類一個是界面啟動線程的﹐一個是對接收數據處理﹐這段程試是兩個死循環﹐外循環是不斷監聽是否有數據傳過來﹐內循環是在數據庫里搜索數據什么處理完并返回信息。望高手能給我點意見﹐不勝感激﹗  public void run()
{
try
{
               String readMess="";
               client=null;
                in=null;
                out=null;
                client =new Socket(ip,port);
                //client =new Socket("10.242.10.75",4660);
                System.out.println(line+"  CONNECTION OK!");
                out = new DataOutputStream(client.getOutputStream());
                in = new DataInputStream(client.getInputStream());
                flag=true;
     while(true) 
    {
     System.out.print(line);
     System.out.println(client.isConnected());
     readMess=in.readLine().trim();
     if(readMess.equals("")||readMess==null)
     { 
     System.out.println("while end!");
          break;
     }
      else
     {
       id=trans.getID(readMess);
       strData=trans.getData(readMess);
       insert_RCV_Data(strData,id);
       int count=0;
       while(true)
     {
          int getflag=get_send_flag(id);
          if(getflag==0)
      {
             sleep(150);
             count++;
             if(count==20)
      {
                          
       try 
        {
            Statement stmt=con.createStatement();
            String strsqlupdate="update SYS_DATA_CHANNEL set flag=4 where id="+id+" and flag=0";
            stmt.executeUpdate(strsqlupdate);
            stmt.close();
            
        } catch(Exception ex) 
        {
            System.out.println("errorUpdate : "+ex.getMessage());
        }
           break;
        }
        }
        else if(getflag==1||getflag==2)
          {
               trans.sendData(out,strData,id,false);
               this.data.insertElementAt("ID:"+id+"  Data:"+strData,0);
               get_send_Data();
               break;
           }
       }
                          
       } 
            }
   catch(Exception e)
  {
   System.out.println(ip+"  Thread run error :"+e.getMessage());
  }
 }

解决方案 »

  1.   

    你这段代码里没有锁,不知如何会牵涉到"死锁".
    你的程序"死掉"具体是什么意思?
    1. 内循环: get_send_flag 保证总是返回 0/1/2 之一,才能较好地保证内循环能终止
    2. 外循环: if(readMess.equals("")||readMess==null) 有待研究详情
      

  2.   

    _17708668(txq) 線程死掉就是接收不到Socket傳送過來的信息﹐內循環剛開始是flag=0﹐不管怎么樣他長時間數據沒有處理內循環也會結束﹐不過它的flag=4然后break﹐就是說處理過的數據fla才能等于1或2.
      

  3.   

    現在問題是為什么外循環readMess=in.readLine().trim()過一段時間突然就接收不到掃描槍傳過來的數據?