java网络编程-线程池服务端

上篇文章我们借助线程实现了服务端可以服务多个客户端,但是每次请求进来都创建新线程也是一种很大的资源消耗,线程上下文切换都会影响性能。

本次我们继续对服务端进行改造,引入一个线程池,限制服务端的资源总量,并对服务端使用线程进行复用。

线程池:

复制代码
public class SocketThreadPool {
    private ExecutorService executor;

    public SocketThreadPool(int maxPoolSize, int queueSize) {
        this.executor = new ThreadPoolExecutor(3,
                maxPoolSize,
                120L,
                TimeUnit.SECONDS, new ArrayBlockingQueue<>(queueSize));
    }

    public void execute(Runnable task){
        this.executor.execute(task);
    }
}
复制代码

服务端task

复制代码
public class ServerTask implements Runnable{
    private Socket socket;

    public ServerTask(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            //4.把字节输入流包装成自己需要的流进行数据的读取。
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //5.循环读取数据并打印到屏幕
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println("收到:" + line);
            }
        } catch (IOException e) {
            System.out.println(socket.getRemoteSocketAddress() + "下线!");
        }
    }
}
复制代码

服务端:

复制代码
public class Server {

    public static void main(String[] args) {
        System.out.println("==服务器的启动==");
        // 1.注册端口
        try {
            ServerSocket serverSocket = new ServerSocket(8888);
            SocketThreadPool threadPool = new SocketThreadPool(3, 100);
            while (true) {
                //2.每接收到客户端的连接,就新建一个线程进行处理
                Socket socket = serverSocket.accept();
                threadPool.execute(new ServerTask(socket));
                System.out.println(socket.getRemoteSocketAddress() + "上线!");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
复制代码

客户端代码不变

复制代码
public class Client {
    public static void main(String[] args) throws Exception {
        System.out.println("==客户端的启动==");
        // 1.创建一个Socket的通信管道,请求与服务端的端口连接。
        Socket socket = new Socket("127.0.0.1", 8888);
        // 2.从Socket通信管道中得到一个字节输出流。
        OutputStream os = socket.getOutputStream();
        // 3.把字节流改装成自己需要的流进行数据的发送
        PrintStream ps = new PrintStream(os);
        // 4.开始发送消息
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String msg = sc.nextLine();
            ps.println(msg);
            ps.flush();
        }
    }
}
复制代码

 

posted @   Mars.wang  阅读(113)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
历史上的今天:
2019-02-28 impala学习笔记
点击右上角即可分享
微信分享提示