Re: [问题] 退出聊天室程式, Stop Thread 问题

楼主: omidofor (妈妈咪呀)   2015-07-05 14:01:01
因为只有看到部份的程式码,
我就先谈我看到的地方。
1. accept 会block。
我在你给的sample没看到accept,不太确定你指的是什么。
2. read input stream
byte[] buf = new byte[5000];
int length = is.read(buf);
is.read(byte[]) 会在is available > 0 的时候马上执行并回传读入的个数,
意思是当server没有打资料的时候会block在这行,一有资料就会执行。
假设server打4000个byte,
有时因为网络问题这4000的byte不一定是一次就传到。
有可能分批2000、300、1000、700到。
假如这4000个byte代表你一个完整的xml,
那在这个情况下就会被分成4个部份parse 4次。
就会有资料不全而错误的情况。
3. 停止thread
这是一个最简单的范例。
public class Connect{
private ConnectThread thread;
public Connect(Socket skt){
thread = new ConnectThread(skt);
}
public void start(){
thread.start();
}
public void shutdown(){
thread.shutdownNow();
}
}
class ConnectThread{
private BufferedInputStream bi;
private boolean flag = false;
public ConnectThread(Socket skt){
bi = new BufferedInputStream(skt.getInuputStream);
}
public void run(){
flag = true;
int code;
while(flag){
code = bi.read()
//do something
}
}
public void shutdownNow(){
flag = false;
bi.close();
}
}
假如你的是写swing,
JFrame注册一个windows listener,
在close时呼叫Connect.shutdown()
如果是javafx
注册一个EventHandler在Stage.setOnCloseRequest()
同样呼叫Connect.shutdown()
或是在任何你自订的事件下呼叫都可以。
(比如按下“结束连线”的按钮)
这个例子中thread同样会block在bi.read()
但当input stream关掉时这里会抛出一个IOException,
再依照你所需的逻辑配合适当的try catch就可以让thread正常结束。
例子中没有包含处理Exception,
但基本操作大概就是这样,
若有什么问题可以再提出讨论。
作者: tas72732002 (葱头)   2015-07-05 21:33:00
恩恩 ~ 很详细, 我说的accept()是read() 我打错了
作者: kurakidream (随波逐流)   2015-07-07 00:58:00
强者我同学 ,人称 multi thread 魔术师

Links booklink

Contact Us: admin [ a t ] ucptt.com