1. server 先启动

 1 public class Server {
 2     public static final int port = 8765;
 3
 4     public static void main(String[] args) {
 5         System.out.println("Server start...\n");
 6         Server server = new Server();
 7         server.init();
 8
 9     }
10
11     public void init()  {
12         try {
13             HandlerExecutorPool executorPool = new HandlerExecutorPool(50, 1000);
14             ServerSocket serverSocket = new ServerSocket(port); //监听端口
15             while(true){
16                 Socket socket = serverSocket.accept(); //接收客户端的请求数据
17                 executorPool.execute(new HandlerThread(socket));
18                 //new Thread(new HandlerThread(socket)).start(); //线程去处理请求
19             }
20         } catch (IOException e) {
21             System.out.println("服务器异常: " + e.getMessage());
22         }
23     }
24 }

View Code

2. server 处理任务的线程

 1 public class HandlerThread implements Runnable {
 2     private Socket socket;
 3     public HandlerThread(Socket socket){
 4         this.socket = socket;
 5     }
 6
 7     @Override
 8     public void run() {
 9         try {
10             BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
11             String clientStr = input.readLine();
12             System.out.println("服务端接收到客户端请求的数据为:"+clientStr);
13
14             PrintStream out = new PrintStream(socket.getOutputStream());
15             System.out.println("服务端请输入响应:\t");
16             String responseStr = new BufferedReader(new InputStreamReader(System.in)).readLine();
17             out.println(responseStr);
18
19             out.close();
20             input.close();
21
22         } catch (IOException e) {
23             System.out.println("服务器 run 异常: " + e.getMessage());
24         } finally {
25             if (socket != null) {
26                 try {
27                     socket.close();
28                 } catch (Exception e) {
29                     socket = null;
30                     System.out.println("服务端 finally 异常:" + e.getMessage());
31                 }
32             }
33         }
34
35     }
36
37 }

View Code

3. 线程池类

 1 public class HandlerExecutorPool {
 2
 3     private ExecutorService executor;
 4     public HandlerExecutorPool(int maxPoolSize, int queueSize){
 5         this.executor = new ThreadPoolExecutor(
 6                 Runtime.getRuntime().availableProcessors(),//corePoolSize
 7                 maxPoolSize,
 8                 120L, //keepAliveTime
 9                 TimeUnit.SECONDS,
10                 new ArrayBlockingQueue<Runnable>(queueSize));
11     }
12
13     public void execute(Runnable task){
14         this.executor.execute(task);
15     }
16 }

View Code

4. 客户端

 1 public class Client {
 2
 3     private static final int port = 8765;
 4     //private static final String host = "localhost"; 可以
 5     //private static final String host = "127.0.0.1"; 可以
 6     private static final String host = "192.168.233.1"; //可以
 7
 8     public static void main(String[] args) {
 9         System.out.println("Client start...");
10         while(true){
11             Socket socket = null;
12             try {
13                 socket = new Socket(host, port);
14                 BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
15                 PrintStream out = new PrintStream(socket.getOutputStream());
16                 System.out.println("客户端请输入请求:\t");
17                 String str = new BufferedReader(new InputStreamReader(System.in)).readLine();
18                 out.println(str);
19
20                 String result = input.readLine();
21                 System.out.println("客户端接收到服务器端响应的数据:" + result);
22                 if("ok".equalsIgnoreCase(result)){
23                     System.out.println("客户端将要关闭连接");
24                     Thread.sleep(500);
25                     break;
26                 }
27                 out.close();
28                 input.close();
29
30             } catch (Exception e) {
31                 System.out.println("客户端异常:" + e.getMessage());
32             } finally {
33                 if(null != socket){
34                     try {
35                         socket.close();
36                     } catch (IOException e) {
37                         socket = null;
38                         System.out.println("客户端finally异常:"+e);
39                     }
40                 }
41             }
42         }
43     }
44 }

View Code

转载于:https://www.cnblogs.com/bravolove/p/8035303.html

SocketIO---bio2---带线程池处理任务相关推荐

  1. JDK自带线程池介绍及使用环境

    1.newFixedThreadPool创建一个指定工作线程数量的线程池.每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中. 2.newCach ...

  2. 多线程与高并发(七):详解线程池 - 自定义线程池,JDK自带线程池,ForkJoin,源码解析等

    Executor 接口关系 Callable:类似于Runnable,但是可以有返回值 Future:存储将来执行的结果.Callable被执行完之后的结果,被封装到Future里面. Future ...

  3. 带线程池的socket客户端与服务端

    前言 socket(套接字),Socket和ServerSocket位于java.net包中,之前虽然对socket有过一些了解,但一直都是云里雾里的,特意仔细的学习了一个socket,用socket ...

  4. 【python爬虫学习记录 持续更新】多线程多进程,带线程池爬取实例

    文章目录 简介 多线程codingFrame 多进程codingFrame 线程池与进程池 线程池爬取实例(主页url隐了 主要看思路 和如何使用线程池框架) 简介 进程是资源单位 线程是执行单位 每 ...

  5. JAVA线程池原理以及几种线程池类型介绍

    在什么情况下使用线程池? 1.单个任务处理的时间比较短      2.将需处理的任务的数量大 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销      2.如不使用线程池, ...

  6. java如何创建一个两个数的队列_java线程池 如何构建一个线程立即到拉到MAX数量跑业务,线程到MAX了,额外的队列可以存储任务的线程池...

    背景:JDK的线程池的运作原理 : JDK的线程池的构造函数有7个参数,分别是corePoolSize.maximumPoolSize.keepAliveTime.unit.workQueue.thr ...

  7. java获取队列长度_关注Java线程池的任务队列长度

    关注Java线程池的任务队列长度 Java 5.0 就开始自带线程池的实现,其中固定大小的线程池,对普通使用还是很好用的.就是 Executors.newFixedThreadPool ,指需要指定一 ...

  8. Spring 线程池使用

    Spring 中默认自带线程池_org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor,一般有可以直接使用,这是时候使用的是默 ...

  9. java多线程和线程池

    目录 零.java线程理解 0.1 两种线程模型 0.1.1 用户级线程 ULT 0.1.2 内核级线程 KLT--JAVA虚拟机使用的线程模型(KLT) 0.2 java线程与系统内核线程 0.3 ...

  10. 线程池很难么?带你从头到尾捋一遍,不信你听不懂!

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/qq_43061290/article/ details/106911277 目标 [理解]线程池基本概念 [理解]线程池工作原 ...

最新文章

  1. J2EE基础之JSP
  2. 从“不务正业”到“回归本行”,“中年”雅戈尔的偶然与必然
  3. 懂你的里程银行,大数据为川航提升用户时代的流量变现力
  4. 基于VHDL的RISC microprocessor设计
  5. 【华为云 ModelArts-Lab AI实战营】第二期
  6. Python+tkinter模拟京东旋转图片式验证码输入
  7. Stanford机器学习---第十一讲.异常检测
  8. Oauth协议是否会泄露用户的密码
  9. 时间+地区 选择器
  10. SVN更改用户名和密码
  11. 硬件工程师的面试问题
  12. UI开发之用PS给图片加水印
  13. 在终端下调用IGV进行截图
  14. 最小二乘法构建线性回归方程
  15. DM MPP集群(带交叉守护进程)安装配置
  16. 计算机专业实习目的与意义,计算机专业实习目的及意义
  17. 2023最新智简魔方快云模板源码+已免授权
  18. matlab使用invfreqs出错,matlab中butter
  19. Java 爪哇学习(三) 基础
  20. 金字塔LK光流法数学原理学习笔记

热门文章

  1. 【Linux】一步一步学Linux——atrm命令(140)
  2. 【Linux】一步一步学Linux——useradd命令(82)
  3. 【Linux】一步一步学Linux——dir命令(了解)(25)
  4. 【C语言】控制台窗口图形界面编程(四):文本输出
  5. 【Qt】Qt5.9连接MySQl5.7(亲自测试成功)
  6. rufus linux开机密码,使用Rufus 3.4制作Ubuntu 18.04.1 U盘启动盘的方法
  7. C语言ODBC方式连接DM数据库
  8. 51nod 1102 面积最大的矩形 新疆大学OJ 1387: B.HUAWEI's billboard 【单调栈】+【拼凑段】(o(n) 或 o(nlog(n))
  9. mysql打平子表_solr初步学习
  10. LVS(8)——tcpdump查看数据包到底如何传递