Android怎么结束一个线程
这是一个接受Socket通讯的线程我start()启动之后它就停止不了了导致所有的socket的包全部传到第一个启动这个线程的页面的Handler方法中问怎么通过对象名终...
这是一个接受Socket通讯的线程 我start()启动之后 它就停止不了了 导致所有的socket的包全部传到第一个启动这个线程的页面的Handler 方法中 问 怎么通过对象名终止这个线程 或者其他有效方法 网上说加个布尔表达式 我加上 对象.exit=true ;Log,i显示 exit 还是false!
class ReadHandlerThread extends Thread{ //读取服务器端数据
private Socket client;
private Handler handler;
public static boolean exit = false;
public ReadHandlerThread(Socket client,Handler handler) { //构造
this.client = client;
this.handler=handler;
}
@Override
public void run() { //run
while(!exit){
DataInputStream dis = null;
try {
value m_value = new value();
dis = new DataInputStream(client.getInputStream());
byte[] b =new byte[136];
dis.readFully(b);
String a=new String(b);
m_value.valueFormat(a);
Message msg = new Message();
msg.what = m_value.Value[1]-'0';
msg.obj=m_value;//上面全是构建数据包
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
} 展开
class ReadHandlerThread extends Thread{ //读取服务器端数据
private Socket client;
private Handler handler;
public static boolean exit = false;
public ReadHandlerThread(Socket client,Handler handler) { //构造
this.client = client;
this.handler=handler;
}
@Override
public void run() { //run
while(!exit){
DataInputStream dis = null;
try {
value m_value = new value();
dis = new DataInputStream(client.getInputStream());
byte[] b =new byte[136];
dis.readFully(b);
String a=new String(b);
m_value.valueFormat(a);
Message msg = new Message();
msg.what = m_value.Value[1]-'0';
msg.obj=m_value;//上面全是构建数据包
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
} 展开
1个回答
展开全部
在Java语言中,安全结束线程的方法就是“让线程的自身流程执行完”。
出现“僵尸线程”的原因:1.线程在死循环中执行。2.线程阻塞。
很明显,你的ReadHandlerThread线程发生了线程阻塞。
dis.readFully(b),你在这里调用了一个阻塞方法,由于socket的另一端一直没有发送数据,ReadHandlerThread线程一直阻塞在了这里,等待接收完136字节的数据。136字节没有接收完,readFully方法将一直处于阻塞状态。
解决方法,设置socket的等待超时值,而不是无限等待。
出现“僵尸线程”的原因:1.线程在死循环中执行。2.线程阻塞。
很明显,你的ReadHandlerThread线程发生了线程阻塞。
dis.readFully(b),你在这里调用了一个阻塞方法,由于socket的另一端一直没有发送数据,ReadHandlerThread线程一直阻塞在了这里,等待接收完136字节的数据。136字节没有接收完,readFully方法将一直处于阻塞状态。
解决方法,设置socket的等待超时值,而不是无限等待。
追问
我增加了一个判断如果登陆成功就break 跳出
if(m_value.Value[2]=='1')
break;//登陆成功
但是,我在别的页面的java类中 new一个新ReadHandlerThread线程 线程启动但是监听不到消息 Log 显示一直卡在readFully(b) 但是我服务器端已经发过消息 而且我为了填满缓冲区 特意传了200byte 的数据
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询