当前位置: 首页 > news >正文

Java网络编程基础:从阻塞式I/O到线程池模型

引言

在Java网络编程的世界中,理解不同的I/O模型对于构建高效的网络应用至关重要。本文将带您从最基础的阻塞式I/O模型出发,逐步过渡到更高效的线程池模型,帮助您建立对Java网络编程的基本认识。

阻塞式I/O模型:一连接一线程

阻塞式I/O是Java网络编程中最简单直观的模型。在这种模型中,服务器为每个客户端连接创建一个专用线程。

SimpleServer实现

public class SimpleServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8080);System.out.println("服务器启动,监听端口:8080...");while (true) {// 接受客户端连接,这是一个阻塞调用Socket clientSocket = serverSocket.accept();System.out.println("客户端已连接:" + clientSocket.getInetAddress());// 为每个客户端创建一个新线程new Thread(() -> handleClient(clientSocket)).start();}}private static void handleClient(Socket clientSocket) {try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {String inputLine;while ((inputLine = in.readLine()) != null) {System.out.println("收到消息:" + inputLine);out.println("服务器回复:" + inputLine);}} catch (IOException e) {System.out.println("处理客户端连接异常:" + e.getMessage());} finally {try {clientSocket.close();} catch (IOException e) {System.out.println("关闭客户端连接异常:" + e.getMessage());}}}
}

阻塞式I/O的优缺点

优点:

  • 实现简单直观
  • 客户端处理逻辑相互独立
  • 适合连接数较少的场景

缺点:

  • 每个连接占用一个线程,资源消耗大
  • 连接数增加时,线程数爆炸
  • 线程上下文切换开销大
  • 不适合高并发场景

线程池模型:资源复用的第一步

为了解决一连接一线程模型的资源浪费问题,线程池模型应运而生。它通过复用有限数量的线程来处理大量连接。

ThreadPoolServer实现

public class ThreadPoolServer {public static void main(String[] args) throws IOException {// 创建固定大小的线程池ExecutorService executor = Executors.newFixedThreadPool(10);ServerSocket serverSocket = new ServerSocket(8080);System.out.println("线程池服务器启动,监听端口:8080...");try {while (true) {// 接受客户端连接,这仍然是一个阻塞调用Socket clientSocket = serverSocket.accept();System.out.println("客户端已连接:" + clientSocket.getInetAddress());// 将客户端处理任务提交到线程池executor.submit(() -> handleClient(clientSocket));}} finally {serverSocket.close();executor.shutdown();}}private static void handleClient(Socket clientSocket) {// 客户端处理逻辑与SimpleServer相同try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {String inputLine;while ((inputLine = in.readLine()) != null) {System.out.println("线程 " + Thread.currentThread().getName() + " 收到消息:" + inputLine);out.println("服务器回复:" + inputLine);}} catch (IOException e) {System.out.println("处理客户端连接异常:" + e.getMessage());} finally {try {clientSocket.close();} catch (IOException e) {System.out.println("关闭客户端连接异常:" + e.getMessage());}}}
}

线程池模型的优缺点

优点:

  • 控制并发线程数量,避免线程爆炸
  • 线程复用,减少创建和销毁线程的开销
  • 可以根据系统负载调整线程池大小
  • 适合中等并发场景

缺点:

  • 每个连接的I/O操作仍然是阻塞的
  • 线程数量仍然与并发连接数相关
  • 高并发场景下仍有性能瓶颈

总结

从阻塞式I/O到线程池模型,我们迈出了Java网络编程优化的第一步。线程池模型通过复用线程资源,在一定程度上提高了服务器的并发处理能力。然而,在面对更高并发的场景时,我们需要探索更先进的模型,如NIO和Reactor模式,这将在后续文章中详细介绍。


文章转载自:

http://XVdxTkZK.mkygc.cn
http://z7tqZ7K5.mkygc.cn
http://YmRxIsWz.mkygc.cn
http://264zkhPa.mkygc.cn
http://uS3cWnJG.mkygc.cn
http://RFRMmIy0.mkygc.cn
http://BljzQ5VP.mkygc.cn
http://u3Vq7yrl.mkygc.cn
http://0JUcS7GW.mkygc.cn
http://dUyiWXqM.mkygc.cn
http://IU0ki5Ax.mkygc.cn
http://5lCquGhc.mkygc.cn
http://xKpjRg5h.mkygc.cn
http://PASOxhdC.mkygc.cn
http://dBHQMIEZ.mkygc.cn
http://UgFkiRGP.mkygc.cn
http://zz2ZngyH.mkygc.cn
http://XYF0klXM.mkygc.cn
http://Us3fSkFy.mkygc.cn
http://5IfAYTDN.mkygc.cn
http://2X7d1LUx.mkygc.cn
http://xooNpAwA.mkygc.cn
http://M1wU0lDt.mkygc.cn
http://LY8SkhG2.mkygc.cn
http://aoZH5JPL.mkygc.cn
http://bUarWj3p.mkygc.cn
http://AtqgCHxC.mkygc.cn
http://HmuxSAm1.mkygc.cn
http://SU6i8SKU.mkygc.cn
http://UxwKIywA.mkygc.cn
http://www.dtcms.com/a/226289.html

相关文章:

  • DAY 34 超大力王爱学Python
  • C++ —— STL容器——string类
  • ps中通过拷贝的图层和通过剪切的图层
  • java多线程与JUC
  • ck-editor5的研究 (4):初步使用 CKEditor5 的插件功能
  • Cesium快速入门到精通系列教程三
  • 高速串行接口
  • Spring Boot 4.0实战:构建高并发电商系统
  • ArkTS基础
  • spining-lidar的电机和激光雷达体(lidar-imu)之间的标定
  • VMware-VMRC-12.0.1-18113358安装包下载安装与使用(附下载)
  • 数学分析——一致性(均匀性)和收敛
  • 高速串行通信解惑说明
  • ReLU的变体
  • 【项目记录】登录认证(下)
  • vscode 代理模式(agent mode),简单尝试一下。
  • Day42 Python打卡训练营
  • powershell7.5@.net环境@pwsh7.5在部分windows10系统下的运行问题
  • 机器人学基础——正运动学(理论推导及c++实现)
  • 智能指针unique
  • Launcher3体系化之路
  • day16 leetcode-hot100-30(链表9)
  • 开源版 PyMOL 如何绘制 新冠病毒 分子结构?
  • NX811NX816美光颗粒固态NX840NX845
  • Debian上安装PostgreSQL的故障和排除
  • 1Remote远程会话管理以及一键启动虚拟机
  • 攻防 FART 脱壳:特征检测识别 + 对抗绕过全解析
  • 终结电源反接与压降损耗:理想二极管控制器深度解析
  • 前端基础学习html+css+js
  • ​​技术深度解析:《鸿蒙5.0+:全场景能效的产业革命》​