java网络通信:伪异步I/O编程(PIO)
缺点:避免了线程资源耗尽的问题,但是根本上来说,serversocket的accept方法和inputstream的输入流方法都是阻塞型方法。
服务端:加了一个线程池,实现线程复用。客户端不变
public class TimeServer {public static void main(String[] args) throws IOException {int port = 8080;ServerSocket server = null;try {server = new ServerSocket(port);System.out.println("The time server is start in port : " + port);Socket socket = null; TimeServerHandlerExecutePool singleExecutor = new TimeServerHandlerExecutePool(50, 10000);// 创建IO任务线程池while (true) {socket = server.accept();singleExecutor.execute(new TimeServerHandler(socket));}} finally {if (server != null) {System.out.println("The time server close");server.close();server = null;}}} }public class TimeServerHandlerExecutePool {private ExecutorService executor;public TimeServerHandlerExecutePool(int maxPoolSize, int queueSize) {executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), maxPoolSize, 120L, TimeUnit.SECONDS,new ArrayBlockingQueue<java.lang.Runnable>(queueSize));}public void execute(java.lang.Runnable task) {executor.execute(task);} }
客户端:
public class TimeClient {public static void main(String[] args) {int port = 8080;Socket socket = null;BufferedReader in = null;PrintWriter out = null;try {socket = new Socket("127.0.0.1", port);in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = new PrintWriter(socket.getOutputStream(), true);out.println("QUERY TIME ORDER");//发送请求System.out.println("Send order 2 server succeed.");String resp = in.readLine();//回复System.out.println("Now is : " + resp);} catch (Exception e) {e.printStackTrace();} finally {if (this.socket != null) {try {this.socket.close();} catch (IOException e1) {e1.printStackTrace();}this.socket = null;}}} }
转载于:https://www.cnblogs.com/nazhizq/p/6538687.html
java网络通信:伪异步I/O编程(PIO)相关推荐
- Netty权威指南之伪异步I/O编程
为了解决同步阻塞I/O一个链路需要一个线程处理问题,对BIO模型做了优化--后端通过一个线程池处理多个客户端的请求接入,设置线程最大值,防止线程并发接入导致的线程耗尽. 当有新的客户端接入时,将客户端 ...
- Netty从入门到精通-伪异步I/O编程
导语 为了解决BIO面临的一个请求链路需要一个处理线程的问题,然后对其线程模型做了优化,后端通过线程池来对多个客户端请求进行接入处理,形成么客户端M线程池最大线程数N的处理比例关系,但这其中还是M ...
- java网络通信:异步非阻塞I/O (NIO)
首先是channel,是一个双向的全双工的通道,可同时读写,而输入输出流都是单工的,要么读要么写.Channel分为两大类,分别是用于网络数据的SelectableChannel和用于文件操作的Fil ...
- java 伪异步 netty,Netty(一) - 不死的达芬奇的个人空间 - OSCHINA - 中文开源技术交流社区...
一.我们先来看BIO的问题: 1 没有数据缓冲区,I/O性能存在问题: 2 没有C或C++中的Channel概念,只有输入和输出流: 3 通常会导致通信线程被长时间阻塞: 4 支持的字符集有限 ...
- java 异步模型_Java IO编程全解(三)——伪异步IO编程
为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例关系,其中M可以远 ...
- JDK 伪异步编程(线程池)
伪异步IO编程 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接.在高性能服务器应用领域,往往需要面向成千上万个客户 ...
- 【3月15日】BIO、伪异步IO以及NIO编程实践
1.引言 从java的I/O体系发展的历史看,先有java.io,后有java.nio.前者一般称之为IO,后者称之为NIO(New IO).但是又由于其特性前者又成为BIO(Block IO),后者 ...
- Java程序员从笨鸟到菜鸟之(十三)java网络通信编程
首先声明一下,刚开始学习Java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所以...呵呵..你懂得,昨天又仔细的学习了一遍,感觉其实java网络编程也没想象的那么难,不信,咱一起看看.. ...
- Java异步非阻塞编程的几种方式
简介: Java异步非阻塞编程的几种方式 一. 从一个同步的Http调用说起 一个很简单的业务逻辑,其他后端服务提供了一个接口,我们需要通过接口调用,获取到响应的数据. 逆地理接口:通过经纬度获取这个 ...
最新文章
- 苹果手机换了屏显示无服务器,苹果将​​为存在显示问题的iPhone 11提供免费更换...
- Iframe高度自适应(兼容IE/Firefox、同域/跨域)
- fail safe java_Java中快速失败(fail-fast)和安全失败(fail-safe)的区别?
- python多列填充缺点_在Python中比较多列中的值并在另一列中添加新值
- AVPlayer 之avcore模块
- weh shell高大上?一文教你实现
- 前端学习(1760):前端调试值之如何让浏览器阻止请求相关资源
- SDL以及扩展库的交叉编译过程简介
- 【2017年第1期】基于外卖物流配送大数据的调度系统
- CSS three column layout
- angular 注入器配置_注入器和发布库–AngularJS学习笔记(三)
- mybatis 3的TypeHandler深入解析(及null值的处理)
- QPSK信号在高斯信道、瑞利信道、Ricean信道下的误码率仿真(matlab)
- Ubuntu安装JDK6和JDK5
- ckplayer 解决flash全屏遮住了div元素,重写全屏/退出全屏方法
- mysql alter字段_mysql alter语句添加、修改、删除字段的例子
- 应届生 实习生 社招最常用招聘网站
- 你的代码会说话吗?(下)
- 2021-08-03 git pull 报错 cannot lock ref
- pt-archive使用
热门文章
- lesson 2.4 - Converting MEL Commands to Python
- AI学习笔记(十)卷积神经网络
- java生僻字_Android上显示生僻字的方法
- 计算机组成原理实用教程第3版课后答案,计算机组成原理实用教程课后习题答案.docx...
- a大于10小于15C语言,计算机基础复习模拟试卷
- keepalived mysql双主架构图_MySQL数据库架构和同步复制流程
- 统计学里“P”的故事:蚊子、皇帝的新衣和不育的风流才子
- 移动开发者走向全能开发者的五大技能
- Fixjs——自定义事件处理
- 如何获得Android设备名称(ADB命令详细介绍)