現在在做一個多線程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());
}
}
{
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());
}
}
解决方案 »
- 输入一个字符串 删除串中所有相同的字符
- 请教高手:怎么用java导出dbf文件?
- Jsp跟servlet有什么区别!
- 用SOCKET开发简单聊天的问题,请教各位,谢谢大家指导!
- 求助:正则表达式的用法
- 怎样取得当前的日期及时间并将其转换为如2005-12-12-21-30-22的字符串
- 如何配置使用SQL Server JDBC驱动程序?
- 散分:下班后,忽然发现今天是自己的生日
- 请问在类中的{ //do something// }和static { //do something//}有什么区别啊?
- 请问这个小问题怎么解决?
- 为何我在JBUILDER中 建完WEB module后 会出现这样的错误呀??
- JAVA的文件类中,什么字符串代表根目录
你的程序"死掉"具体是什么意思?
1. 内循环: get_send_flag 保证总是返回 0/1/2 之一,才能较好地保证内循环能终止
2. 外循环: if(readMess.equals("")||readMess==null) 有待研究详情