作者omidofor (妈妈咪呀)
看板java
标题Re: [问题] 退出聊天室程式, Stop Thread 问题
时间Sun Jul 5 14:01:01 2015
因为只有看到部份的程式码,
我就先谈我看到的地方。
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,
但基本操作大概就是这样,
若有什麽问题可以再提出讨论。
--
│▃▃▃▃▃▃▃ ● ▃▃█ ▃▃▃▃ ██▃▃▃▃▃▃▃▃│
│ ▇▇▇ ▇▇▇ ▇ ▇▇█ ▇▇▇ ▇█▇ ▇▇▇ ▇ ▇ │
│ █ █ ▉▉█ █ █ █ █ █ █ █ █ ██◤
◢│
│ ███ ▉▉█ █ ███ ███ █ ███ █
▄ ◆│
│▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄██│ By luh4
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 219.70.196.68
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1436076064.A.1C3.html
1F:推 tas72732002: 恩恩 ~ 很详细, 我说的accept()是read() 我打错了 07/05 21:33
2F:推 tas72732002: 且抛出异常, thread 应该就已经结束了 07/06 16:49
3F:推 kurakidream: 强者我同学 ,人称 multi thread 魔术师 07/07 00:58