作者calais007 (淺水中)
看板java
標題Re: [問題] 關閉serverSocket.accept()的Thread
時間Wed Jul 20 14:23:38 2011
※ 引述《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
→ james732:原來如此,我還真沒想到丟一個連線給它 XDDD 07/20 14:42
→ dou0228:ServerSocket.setSoTimeout() ... 07/20 16:56
推 po500922:其實有個辦法可以在外部將socket close掉 08/22 20:59