开发者社区> 问答> 正文

请问java如何关闭嵌套的线程?

我的目的是在tomcat启动关闭的时候同时启动和关闭serverSocket。为了实现同时开启多个端口,每个端口同时提供给多人访问,所以使用了多线程。
请问怎么实现啊?
下面我使用了监听器:
screenshot

package com.safe.tcp;
 
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
 
public class TCPThreadForServer implements Runnable {
    private ServerSocket server;
 
    public TCPThreadForServer(ServerSocket server) {
        super();
        this.server = server;
    }
 
    public void closeServer() throws IOException {
        System.out.println("closeServer():关闭server");
        if (null != server) {
            server.close();
        }
    }
 
    @Override
    public void run() {
        Socket client = null;
        Thread clientThread = null;
        try {
            boolean flag = true;
            while (flag) {
                System.out.println("服务器开启,等待客户端访问……flag=" + flag);
                client = server.accept();
                clientThread = new Thread(new TCPThreadForClient(client));
                // clientThread.setDaemon(true);//所有客户线程都设置为后台线程
                clientThread.start();
            }
            System.out.println("一个service 的run 关闭client server");
            client.close();
            server.close();
            System.out.println("一个service 的run执行完毕");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package com.safe.tcp;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
 
public class TCPThreadForClient implements Runnable {
    private Socket client;
 
    public Socket getClient() {
        return client;
    }
 
    public void setClient(Socket client) {
        this.client = client;
    }
 
    public TCPThreadForClient(Socket client) {
        super();
        this.client = client;
    }
 
    @Override
    public void run() {
        BufferedReader buf = null;
        PrintStream out=null; 
        try {
            buf=new BufferedReader(new InputStreamReader(client.getInputStream()));
            out=new PrintStream(client.getOutputStream());
            boolean flag=true;
            while (flag) {
                String str=buf.readLine();
                if(str==null||"".equals(str)||"bye".equals(str)){
                    flag=false;
                }else {
                    System.out.println("服务端收到客户端说:"+str);
                    out.println("ECHO:"+str);
                }
            }
             
            System.out.println("当前断开一位~");
            out.close();
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}

可是发现关闭了server 客户端发送东西 还是有对应返回

展开
收起
落地花开啦 2016-06-03 13:27:17 3058 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    你用个list把socket都保存起来,把他也作为参数传入线程中,socket关闭的时候从list移除,然后在你关闭服务的时候,循环list里的socket,然后close掉,这个要求这个集合是个线程安全集合

    2019-07-17 19:26:29
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载