请问java如何关闭嵌套的线程?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

2016-06-03 13:27:17 2602 1

我的目的是在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 客户端发送东西 还是有对应返回

取消 提交回答
全部回答(1)
  • 落地花开啦
    2019-07-17 19:26:29

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

    0 0
相关问答

1

回答

Java线程是什么?

2021-10-29 19:31:20 214浏览量 回答数 1

1

回答

Java中哪些集合类是线程安全的?

2021-10-25 14:20:34 177浏览量 回答数 1

1

回答

Java 实例 - 中断线程

2020-02-13 17:57:34 815浏览量 回答数 1

4

回答

Java中如何保证线程安全?

2019-11-11 14:28:55 3458浏览量 回答数 4

1

回答

Java同步问题,线程之间进行通信

2019-10-03 19:37:42 395浏览量 回答数 1

1

回答

java怎么线程安全

2018-05-10 20:07:48 1269浏览量 回答数 1

1

回答

为什么要使用java线程

2018-05-10 20:09:26 1267浏览量 回答数 1

1

回答

java 线程是什么

2018-05-10 20:08:31 1240浏览量 回答数 1

3

回答

java程序调错

2016-06-07 14:47:03 3042浏览量 回答数 3

1

回答

java中简单的线程问题

2016-05-31 11:30:13 1587浏览量 回答数 1
+关注
落地花开啦
喜欢技术,喜欢努力的人
0
文章
7824
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载