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(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
2019-02-28 impala学习笔记