Re: [問題] 關閉serverSocket.accept()的Thread

看板java作者 (淺水中)時間12年前 (2011/07/20 14:23), 編輯推噓1(103)
留言4則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《james732 (好人超)》之銘言: : 如果我有一個新執行緒,裡面有個無窮迴圈執行 serverSocket.accept() : private class ListenThread extends Thread { : ServerSocket serverSocket; : public ListenThread(ServerSocket s) { : serverSocket = s; : } : @Override : public void run() { : try { : while (true) { : Socket s = serverSocket.accept(); : new JobThread(s).start(); : } : } catch (IOException e) { : } : } : } : public static void Main(String[] s) { : Thread t = new ListenThread(new ServerSocket(5566)); : t.start(); : // 做一些其他的工作 : // 我想在這裡結束執行緒 t, 並且關閉 ServerSocket : // 繼續做一些其他的工作 : } : 我想問的是,當這個執行緒在 accept() 等待 client 的連線時 : 要怎麼樣能夠結束這個執行緒,同時關閉這個 ServerSocket 呢? : 另外分享一件蠢事... : 我最近把程式寫成這樣 : new Thread() { : @Override : public void run() { : // 一些耗時的工作 : } : }.run(); : 然後很疑惑為什麼我會一直收到ANR(Android is Not Responding) : 還在想說Android的thread是不是哪裡不一樣... : 之前比較習慣寫這樣 : class MyThread extends Thread { ... } : main() { : MyThread t = new Thread(); : t.start(); // 這個時候明明不會寫錯.... : } : 練習(偷懶)用了一下 Anonymous inner class 就耍笨了... : 覺得 override run() 之後接著執行 run() 是一件很順手的事 orz 當ServerSocket在Accept的時候 你是無法直接關掉這個Thread的 因為他block住了 但你可以先連線後再關掉這個Thread e.g ....略 while (true) { Socket s = serverSocket.accept(); if ( !isShutdown ) { new JobThread(s).start(); } else { s.close(); break; // break while loop } } public void ShutDownServer() { isShutdown = true; // 打開一個socket連ServerSocket // 讓while loop往下移動 new Socket( serverSocket.getInetAddress(),serverSocket.getLocalPort() ); //....做其他reference clean up的動作 } 其實做法跟我之前的推文類似 只是多去做一個socket連線而已 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.176.8.219

07/20 14:42, , 1F
原來如此,我還真沒想到丟一個連線給它 XDDD
07/20 14:42, 1F

07/20 14:45, , 2F
另外我有想到另一個解法 http://pastie.org/2241341
07/20 14:45, 2F

07/20 16:56, , 3F
ServerSocket.setSoTimeout() ...
07/20 16:56, 3F

08/22 20:59, , 4F
其實有個辦法可以在外部將socket close掉
08/22 20:59, 4F
文章代碼(AID): #1E9dHkld (java)
文章代碼(AID): #1E9dHkld (java)