Re: [問題] 退出聊天室程式, Stop Thread 問題

看板java作者 (媽媽咪呀)時間9年前 (2015/07/05 14:01), 編輯推噓3(300)
留言3則, 2人參與, 最新討論串2/2 (看更多)
因為只有看到部份的程式碼, 我就先談我看到的地方。 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://www.ptt.cc/bbs/java/M.1436076064.A.1C3.html

07/05 21:33, , 1F
恩恩 ~ 很詳細, 我說的accept()是read() 我打錯了
07/05 21:33, 1F

07/06 16:49, , 2F
且拋出異常, thread 應該就已經結束了
07/06 16:49, 2F

07/07 00:58, , 3F
強者我同學 ,人稱 multi thread 魔術師
07/07 00:58, 3F
文章代碼(AID): #1LcCWW73 (java)
文章代碼(AID): #1LcCWW73 (java)