日期:2014-05-20  浏览次数:20755 次

奇怪的```线程问题````
public class User extends Thread {
private Socket userSocket=null; //和客户端通信的socket
private int connectionId=0; //用户连接id

private InputStream inputStream=null;
private byte userMsgs[] = null; //从客户观接收到的消息




//构造函数
public User(int connectionId,Socket s){
this.connectionId=connectionId;
this.userSocket=s;

try {
this.inputStream=s.getInputStream();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

//开始线程
public void run(){

while(true){
this.processUserMsgs();
}


}

//读取客户端发送来的消息
private void processUserMsgs(){
userMsgs = new byte[10]; //创建用于接收消息的变量
try {
this.inputStream.read(userMsgs); //读取消息报
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

//处理客户端消息报数组
for(byte userMsg : userMsgs){
System.out.println(userMsg);
}
}
}


我写了个这样的类``
当客户端连接的时候``

while(true){
this.processUserMsgs();
}
这里this.processUserMsgs(); 只有当客户端发消息的时候才被调用,要不然就进不到这里``

而当我把客户端关掉的时候``````
他才开始无限循环到这里``this.processUserMsgs();

这是啥意思```不是应该本来就会无限循环到这里的么?


------解决方案--------------------
程序不完整,不能准确判断。


一种可能是你判断错误,最好在循环中增加一句调试:
while(true){
System.out.print(".");
this.processUserMsgs();
}


另一种可能是在还没启动线程时就被阻塞了,最好检查下Client端有无flush()动作。
------解决方案--------------------
最好把产生这个类的对象及启动线程的代码贴出来.