java 服务器线程池测试
ncat 有个允许多客户端连接的参数,默认是100,我用线程池实现了类似的功能。
创建服务器线程池大小为100,可以同时处理100个连接,第100个往后的客户端需要等待前100个客户端有退出,它才能连上。
Server.java
import java.io.*;
import java.net.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Server {static ExecutorService executorService;static ServerSocket serverSocket;static Socket socket;static SocketAddress socketAddress;public static void main(String[] args) throws IOException {socketAddress = new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 6000);serverSocket = new ServerSocket();serverSocket.bind(socketAddress);executorService = Executors.newFixedThreadPool(100);// 监听线程new Thread(new Runnable() {@Overridepublic void run() {try {while (true) {socket = serverSocket.accept();System.out.println(socket.getRemoteSocketAddress().toString());Thread clientThread = new ClientThread(socket);executorService.execute(clientThread);}} catch (IOException e) {e.printStackTrace();}}}).start();}
}class ClientThread extends Thread {static int num = 0;Socket socket;public ClientThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));String s = "你是第 " + (++num) + " 个客户端\n";out.write((s.getBytes()));out.flush();byte[] buffer = new byte[1024];while ((in.read(buffer)) != -1) {System.out.println(new String(buffer));}} catch (IOException e) {e.printStackTrace();}}
}
Client.java
import java.io.*;
import java.net.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Server {static ExecutorService executorService;static ServerSocket serverSocket;static Socket socket;static SocketAddress socketAddress;public static void main(String[] args) throws IOException {socketAddress = new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 6000);serverSocket = new ServerSocket();serverSocket.bind(socketAddress);executorService = Executors.newFixedThreadPool(100);// 监听线程new Thread(new Runnable() {@Overridepublic void run() {try {while (true) {socket = serverSocket.accept();System.out.println(socket.getRemoteSocketAddress().toString());Thread clientThread = new ClientThread(socket);executorService.execute(clientThread);}} catch (IOException e) {e.printStackTrace();}}}).start();}
}class ClientThread extends Thread {static int num = 0;Socket socket;public ClientThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));String s = "你是第 " + (++num) + " 个客户端\n";out.write((s.getBytes()));out.flush();byte[] buffer = new byte[1024];while ((in.read(buffer)) != -1) {System.out.println(new String(buffer));}} catch (IOException e) {e.printStackTrace();}}
}
java 服务器线程池测试相关推荐
- java中线程池的几种实现方式
1.线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 ...
- 自定义java线程池_我的Java自定义线程池执行器
自定义java线程池 ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,也不必关注核心功能. 我创建了一个自定义线 ...
- 我的Java自定义线程池执行器
ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,而将精力放在核心功能上. 我创建了一个自定义线程池执行程序,以更 ...
- java 线程池 复用机制,java的线程池框架及线程池的原理
java 线程池详解 什么是线程池? 提供一组线程资源用来复用线程资源的一个池子 为什么要用线程池? 线程的资源是有限的,当处理一组业务的时候,我们需要不断的创建和销毁线程,大多数情况下,我们需要反复 ...
- [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍
1 Java中线程池概述 1.1 什么是线程池? 在一个应用当中, 我们往往需要多次使用线程, 这意味着我们需要多次创建和销毁线程.那么为什么不提供一个机制或概念来管理这些线程呢? 该创建的时候创建, ...
- Java创建线程池的方式
Java创建线程池的方式 文章目录 Java创建线程池的方式 一.通过Executors工厂方法创建 1.Executors.newSingleThreadExecutor() 2.Executors ...
- Java 自定义线程池
Java 自定义线程池 https://www.cnblogs.com/yaoxiaowen/p/6576898.html public ThreadPoolExecutor(int corePool ...
- Java并发—线程池ThreadPoolExecutor基本总结
原文作者:Matrix海子 原文地址:Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线 ...
- java定时线程池_java 定时器线程池(ScheduledThreadPoolExecutor)的实现
前言 定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行.但定时器线程池也还是线程池,最底层实现还是ThreadPoolExecutor,可以参考我的另外一篇文章多线程–精通Thre ...
最新文章
- ASP.NET中使用MD5和SHA1算法加密
- ASP.NET跨页面传值(二)
- jsp页面提示“Multiple annotations found at this line: - The superclass javax.servlet.http.HttpServlet w
- Tomcat 启动提示未发现 APR 的解决方法
- 【目标检测】ATSS: bridging the gap between anchor-based and anchor-free detection via ATSS (cvpr20)
- 前端页面通过web3.eth.accounts无法获取账户信息
- 《HTML5+CSS3网页设计入门必读》——第1章 标记简史1.1 从IETF到W3C:HTML 4的诞生过程...
- 互联网行业不需要中年人,那些35岁离开BAT的人都去哪了?
- 运行时 不显示对话框 只显示 对话框上面的控件
- Base64编码(java)
- 谷雨,微信公众号图文排版必备素材集锦
- bitbucket 代码备份
- 绕过SSL双向校验抓取Soul App的数据包
- Java通过substring截取指定字符
- NLP学习(十)-情感分析技术及案例实现-Python3实现
- 【人工智能】人工智能顶级研究所+人工智能顶级研究机构+人工智能顶级大学推荐!
- 常用元器件封装的命名规范-001
- 创造鲜活的三维数字城市
- android 画空心矩形框,Android实现空心圆角矩形按钮的实例代码
- 智能手机android下的记步器的实现
热门文章
- es6箭头函数_ES6语法之-箭头函数
- ad软件 pcb如何走线过孔_【经验】关于高速PCB设计的一些经典问答
- Docker:Docker的简介、安装、使用方法之详细攻略
- ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能
- ML:分类预测问题中评价指标(ER/混淆矩阵P-R-F1/ROC-AUC/RP/mAP)简介、使用方法、代码实现、案例应用之详细攻略
- AdaBoost算法特性
- 机器学习-特征工程中的特征选择
- C语言实现常用数据结构——堆
- UVa 11971 - Polygon(几何概型 + 问题转换)
- 那些永不消逝的进程 (转)