Re: [問題] 關閉serverSocket.accept()的Thread
※ 引述《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
07/20 14:42, 1F
→
07/20 14:45, , 2F
07/20 14:45, 2F
→
07/20 16:56, , 3F
07/20 16:56, 3F
推
08/22 20:59, , 4F
08/22 20:59, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):