作者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
1F:→ james732:原来如此,我还真没想到丢一个连线给它 XDDD 07/20 14:42
3F:→ dou0228:ServerSocket.setSoTimeout() ... 07/20 16:56
4F:推 po500922:其实有个办法可以在外部将socket close掉 08/22 20:59