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