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

佛山新网站建设流程台州椒江网站建设

佛山新网站建设流程,台州椒江网站建设,400选号网站源码,餐厅类网站模板作者简介#xff1a;☕️大家好#xff0c;我是Aomsir#xff0c;一个爱折腾的开发者#xff01; 个人主页#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言多线程… 作者简介☕️大家好我是Aomsir一个爱折腾的开发者 个人主页Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言多线程版线程池版总结 参考文献 孙哥suns说NettyNetty官方文档 前言 前一篇文章中我学到了与Netty有关的基础知识了解NIO这个非阻塞式IO那今天我们来聊聊传统的网络通信开发方式以及它所存在的问题也就是使用 Socket的方式。Socket是阻塞式的IO我们要做通信肯定得涉及多线程或者线程池的方式这两种方式对于Socket都不友好都有问题如下详细分析一下。 注意由于我们平常开发都是面向Tomcat开发的很少会有机会能够接触Socket编程 多线程版 下面是多线程版网络通信的情况。从图中可以明显看出随着客户端请求服务端的增加服务端为处理这些请求不断创建新线程而这一过程缺乏充分的限制会无节制的进行创建。每次虚拟机创建线程都需要与操作系统进行通信这会耗费时间和占用内存导致内存使用量不断上升。此外当所创建的线程数量超过了CPU核心数时CPU就不得不进行轮转处理这将导致CPU占用率飙升。 public class AomsirServer {public static void main(String[] args) {ServerSocket serverSocket null;try {serverSocket new ServerSocket(8080);Socket socket null;while (true) {socket serverSocket.accept();new Thread(new AomsirServerHandler(socket)).start();}} catch (Exception e) {e.printStackTrace();} finally {if (serverSocket ! null) {try {serverSocket.close();} catch (IOException e) {throw new RuntimeException(e);}}}} }/*** 用于处理通信请求的线程*/ class AomsirServerHandler implements Runnable {private Socket socket;public AomsirServerHandler(Socket socket) {this.socket socket;}public void run() {BufferedReader bufferedReader null;try {bufferedReader new BufferedReader(new InputStreamReader(this.socket.getInputStream()));while (true) {String line bufferedReader.readLine();if (line ! null) {System.out.println(line line);}}} catch (Exception e) {e.printStackTrace();} finally {if (bufferedReader ! null) {try {bufferedReader.close();} catch (IOException e) {throw new RuntimeException(e);}}}} }public class AomsirClient {public static void main(String[] args) {Socket socket null;PrintWriter printWriter null;try {socket new Socket(127.0.0.1, 8080);printWriter new PrintWriter(socket.getOutputStream());printWriter.write(send date to server );printWriter.flush();} catch (Exception e) {e.printStackTrace();} finally {if (socket ! null) {try {socket.close();} catch (IOException e) {throw new RuntimeException(e);}}if (printWriter ! null) {printWriter.close();}}} }线程池版 在上述多线程版网络通信中服务端以一种无限制的方式为每个请求创建新线程这导致高并发下线程数量无限增加。为了解决这一问题我们提出了一种解决方案即使用线程池。这是一种基于池化思想的方法通过在服务端启动时创建固定数量的线程例如N个来限制后续线程的创建。这N个线程将专用于后续请求的处理不再创建新的线程。当一个请求完成处理后线程将被放回线程池以供后续请求使用。如果请求数量超过了线程池的线程数量后续请求将进入队列等待。这一方法有效地解决了无节制创建线程的问题。 然而尽管线程池解决了线程创建问题它引入了新的潜在问题即阻塞问题。举例来说如果线程1分配给了客户端A但客户端1在某一时刻发生阻塞无法继续处理请求线程1将不得不一直等待客户端A无法返回线程池导致服务端处理请求的效率降低。 public class AomsirServer1 {// 创建线程池private static ExecutorService executorService;// 初始化线程池static{executorService new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),20,120L, TimeUnit.SECONDS,new ArrayBlockingQueueRunnable(1000));}public static void main(String[] args) {ServerSocket serverSocket null;try {serverSocket new ServerSocket(8080);Socket socket null;while (true) {socket serverSocket.accept();//new Thread(new SunsServerHandler(socket)).start();//线程池executorService.execute(new AomsirServerHandler(socket));}} catch (Exception e) {e.printStackTrace();} finally {if (serverSocket ! null) {try {serverSocket.close();} catch (IOException e) {throw new RuntimeException(e);}}}} }/*** 服务端处理客户端请求的线程*/ class AomsirServerHandler implements Runnable {private Socket socket;public AomsirServerHandler(Socket socket) {this.socket socket;}public void run() {BufferedReader bufferedReader null;try {bufferedReader new BufferedReader(new InputStreamReader(this.socket.getInputStream()));while (true) {String line bufferedReader.readLine();if (line ! null) {System.out.println(line line);}}} catch (Exception e) {e.printStackTrace();} finally {if (bufferedReader ! null) {try {bufferedReader.close();} catch (IOException e) {throw new RuntimeException(e);}}}} }public class AomsirClient1 {public static void main(String[] args) {Socket socket null;PrintWriter printWriter null;try {socket new Socket(127.0.0.1, 8080);printWriter new PrintWriter(socket.getOutputStream());printWriter.write(send date to server );printWriter.flush();} catch (Exception e) {e.printStackTrace();} finally {if (socket ! null) {try {socket.close();} catch (IOException e) {throw new RuntimeException(e);}}if (printWriter ! null) {printWriter.close();}}} }总结 在客户端-服务器结构中使用BIO阻塞I/O进行网络通信时无论是无限制地创建线程还是通过线程池限制线程创建都难以避免一个共同的问题当客户端连接到服务器后在一段时间内不进行通信线程将被空闲浪费导致资源的低效利用。 为了解决这个问题我们可以采用NIO非阻塞I/O来处理网络通信。NIO允许服务器同时管理多个连接而不需要为每个连接创建一个单独的线程。这使得服务器能够更高效地处理大量连接减少了资源浪费。Netty是一个常见的工具它底层使用了NIO为我们开发者提供了更容易使用和管理的方式来构建高性能的网络应用
http://www.sadfv.cn/news/78419/

相关文章:

  • 网站开发工程师岗位概要成都设计公司排行
  • 校园网站建设可行性分析四川建设发展股份有限公司网站
  • 项目进度管理软件app优化关键词排名的工具
  • 网站开发实例模板wordpress 固定链接插件
  • 网站栏目类型模板免费的ppt软件
  • 网站建设科技项目申报书范文google广告投放技巧
  • 国外企业合作的网站响应式网站模板的特点
  • 做网站需要几个人分工wordpress 多层分类
  • 机场网站建设微信小商店怎么分销
  • 怎么做的英文网站wordpress爱视频
  • asp网站伪静态规则网站建设上线流程图
  • 视频网站建设需要多少钱专门为98k做的网站
  • 网站开发思维导图做做网站下载免费
  • 厦门高端模板建站双井网站建设公司
  • 主流建站cms汽车网站怎么做
  • 网站如何做tag浙江创都建设有限公司网站
  • 如何做直接打开网站的二维码公司网站建设如何摊销
  • 网站主办单位变更工作室团队官网源码
  • 网站配置服务Wordpress企业seo网站推广公司
  • 用微信小程序怎么做网站网站运营顾问
  • 做问卷调查用哪个网站做个网站要多少钱 一般
  • 题库网站怎么做银川市住房和城乡建设网站
  • 恩施网站建设教程沈阳百度网站排名
  • 机械网站精选网站制作公司北京网站建设公司
  • html中文美食网站网站被k 如何恢复
  • 永州网站建设如何erp管理系统软件怎么用
  • 攻击网站方法网页设计评价
  • 北京学设计去哪个网站好荣成住房和城乡建设部网站
  • 帝国音乐网站怎么做数据表泗洪做网站
  • 四川住房城乡建设厅网站电话wordpress抓取 ins