[Java线程池之处理网络请求]

2023/11/30 8:42:49

目录

 💖前言:

💖下面是一个使用Java线程池处理网络请求的示例代码:

💖使用线程池的submit()方法实现:

💖优化代码实现:

💖涉及的调用:


 💖前言:

   笔记

💖下面是一个使用Java线程池处理网络请求的示例代码:

Java线程池可以处理大量的网络请求,从而提高服务器的吞吐量和并发性能。在处理网络请求时,线程池可以将请求分配给多个线程执行,从而充分利用服务器的CPU资源,提高服务器的并发性能。

 

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NetworkThreadPoolDemo {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
            while (true) {
                Socket socket = serverSocket.accept();
                executorService.submit(() -> {
                    // 处理网络请求的逻辑
                    System.out.println(Thread.currentThread().getName() + ": " + socket.getInetAddress());
                    socket.close();
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        executorService.shutdown();
    }
}
  • 上面的代码中,我们使用了Java线程池来处理网络请求。我们使用了一个固定大小的线程池,可以同时处理10个请求。在接收到每个请求时,我们将其提交给线程池处理,从而提高服务器的吞吐量和并发性能。在处理每个请求时,我们使用了Lambda表达式来简化代码。
    

💖使用线程池的submit()方法实现:

  1. 使用线程池的预定义工厂方法:Java提供了一些预定义的线程池工厂方法,例如Executors.newFixedThreadPool()、Executors.newCachedThreadPool()、Executors.newSingleThreadExecutor()等。这些工厂方法可以根据不同的场景选择不同的线程池类型,从而提高程序的性能和可维护性。

  2. 使用线程池的拒绝策略:当线程池中的线程数量达到最大值时,新的任务将被拒绝。可以使用线程池的拒绝策略来处理这种情况,例如AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy等。这些策略可以根据不同的场景选择不同的处理方式,从而提高程序的可靠性和可维护性。

  3. 使用线程池的submit()方法来提交任务:可以使用线程池的submit()方法来提交任务,从而提高程序的可靠性和可维护性。

  4. 使用线程池的execute()方法来提交任务:如果不需要获取任务的返回值,可以使用线程池的execute()方法来提交任务,从而提高程序的性能和可维护性。

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

public class NetworkThreadPoolDemo {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
            while (true) {
                Socket socket = serverSocket.accept();
                executorService.submit(() -> {
                    // 处理网络请求的逻辑
                    System.out.println(Thread.currentThread().getName() + ": " + socket.getInetAddress());
                    socket.close();
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        executorService.shutdown();
    }
}

💖优化代码实现:

  1. 使用线程池的自定义ThreadFactory:可以使用线程池的自定义ThreadFactory来创建线程,从而提高程序的可维护性。自定义ThreadFactory可以为每个线程设置有意义的名称、优先级、是否为守护线程等属性,方便调试和监控。

  2. 使用线程池的自定义RejectedExecutionHandler:可以使用线程池的自定义RejectedExecutionHandler来处理任务被拒绝的情况,从而提高程序的可靠性和可维护性。自定义RejectedExecutionHandler可以根据不同的场景选择不同的处理方式,例如记录日志、重试任务、抛出异常等。

使用线程池的ThreadPoolExecutor类:可以使用线程池的ThreadPoolExecutor类来创建线程池,从而提高程序的可维护性。ThreadPoolExecutor类提供了更多的配置选项,例如核心线程数、最大线程数、线程存活时间、任务队列等,可以根据不同的场景选择不同的配置选项,从而提高程序的性能和可靠性。

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

public class NetworkThreadPoolDemo {
    public static void main(String[] args) {
        ThreadFactory threadFactory = new CustomThreadFactory("NetworkThreadPool");
        RejectedExecutionHandler rejectedExecutionHandler = new CustomRejectedExecutionHandler();
        ThreadPoolExecutor executorService = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(100), threadFactory, rejectedExecutionHandler);
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
            while (true) {
                Socket socket = serverSocket.accept();
                executorService.submit(() -> {
                    // 处理网络请求的逻辑
                    System.out.println(Thread.currentThread().getName() + ": " + socket.getInetAddress());
                    socket.close();
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        executorService.shutdown();
    }

    static class CustomThreadFactory implements ThreadFactory {
        private final String namePrefix;

        public CustomThreadFactory(String namePrefix) {
            this.namePrefix = namePrefix;
        }

        @Override
        public Thread newThread(Runnable r) {
            Thread thread = new Thread(r);
            thread.setName(namePrefix + "-" + thread.getId());
            thread.setPriority(Thread.NORM_PRIORITY);
            thread.setDaemon(false);
            return thread;
        }
    }

    static class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            System.out.println("Task rejected: " + r.toString());
        }
    }
}
  • 上面的代码中,我们使用了Java线程池来处理网络请求。我们使用了一个自定义的ThreadFactory来创建线程,为每个线程设置有意义的名称、优先级、是否为守护线程等属性,方便调试和监控。我们还使用了一个自定义的RejectedExecutionHandler来处理任务被拒绝的情况,记录日志并输出被拒绝的任务信息。我们使用了ThreadPoolExecutor类来创建线程池,提供了更多的配置选项,例如核心线程数、最大线程数、线程存活时间、任务队列等,可以根据不同的场景选择不同的配置选项,从而提高程序的性能和可靠性。

💖涉及的调用:

  • java.net.ServerSocket:用于监听指定端口的网络请求。

  • java.net.Socket:用于表示一个客户端连接。

  • java.util.concurrent.ExecutorService:用于管理线程池中的线程。

  • java.io.BufferedReader:用于读取客户端发送的数据。

  • java.io.InputStreamReader:用于将字节流转换为字符流。

  • java.io.PrintWriter:用于向客户端发送数据。

  • java.io.IOException:表示I/O异常。


http://www.jnnr.cn/a/564369.html

相关文章

使用凌鲨连接SSH服务器

SSH&#xff08;Secure Shell&#xff09;是一种加密的网络协议&#xff0c;用于安全地连接远程服务器。它提供了一种安全的通信方式&#xff0c;使得用户可以在不受干扰的情况下远程访问服务器。SSH协议的加密技术可以保护用户的登录信息和数据传输过程中的安全性。 SSH对于服…

《计算机系统与网络安全》第五章 消息认证与数字签名

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

vue3 elementplus table合并

table表格下方合并写法&#xff1a; 1&#xff1a;单行合并 &#xff08;1&#xff09;在标签中加入属性 :summary-method"getSummaries":show-summary"true"<el-table:data"data"id"tableRef"ref"tableRef"row-key"…

Java 针对Word模板内容替换输出

对应依赖 <repositories><!-- 使用 Free Spire.Doc for Java 的jar包实现替换word中的内容--><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://repo.e-iceblue.cn/repository/maven-public/</url&…

【MySQL】数据库 ⑤

✍导出数据 1、使用 SELECT ... INTO OUTFILE 语句导出数据 SELECT...INTO OUTFILE 是 MySQL 用于导出数据的语句&#xff0c;它允许将查询结果保存到指定的文件中。 该语句的基本语法如下&#xff1a; SELECT column1, column2, ... INTO OUTFILE file_path FIELDS TE…

Scala面向对象【下】

1、特质 Scala 语言中&#xff0c;采用特质 trait&#xff08;特征&#xff09;来代替接口的概念&#xff0c;也就是说&#xff0c;多个类具有相同的特质&#xff08;特征&#xff09;时&#xff0c;就可以将这个特质&#xff08;特征&#xff09;独立出来&#xff0c;采用关键…

SpringSecurity认证流程(超级详细)

1 .前言 最近开发项目的时候遇到了和SpringSecurity相关的一些问题&#xff0c;但是之前并没有去了解过SpringSecurity&#xff0c;导致改系统安全权限验证的时候就比较吃力了&#xff0c;目前项目开发大多都直接用脚手架直接开发&#xff0c;系统安全权限验证已经形成了&…

线性代数笔记整理

文章目录 1 行列式2 矩阵&#xff08;本质是数表&#xff09;3 方程组的解4 向量5 矩阵的特征值和特征向量6 相似矩阵和相似对角化7 合同对角化8 二次型及其标准型 1 行列式 2 矩阵&#xff08;本质是数表&#xff09; 3 方程组的解 4 向量 5 矩阵的特征值和特征向量 6 相似矩阵…

【算法与数据结构】344、LeetCode反转字符串

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;关于变量交换有两种办法&#xff0c;一种是最常见的引入一个临时变量方法&#xff0c;另一种是使用位运…

Jupyter Notebook左侧大纲目录设置

在 Jupyter Notebook 中&#xff0c;可以通过安装jupyter_contrib_nbextensions插件来实现在页面左边显示大纲的功能。 1. 安装插件 pip install jupyter_contrib_nbextensions 1.1 如何安装 windows cmd小黑裙窗口&#xff1b; 1.查看目前安装了哪些库 conda list 2. 使用…

大数据面试题之Mysql:每日三题(五)

大数据面试题之Mysql:每日三题 1.MySQL索引存储结构(六种)2.on和where的区别3.mysql是怎么查重的&#xff1f;(重点掌握3种&#xff0c;distinct&#xff0c;group by&#xff0c;row_number) 很开心写完上一篇&#xff0c;就立刻找到了我入职的第二家公司&#xff0c;所以我还…

Debezium系列之:监控 Debezium 实例

Debezium系列之&#xff1a;监控 Debezium 实例 一、概述二、实现步骤三、执行四、打开Grafana UI五、关闭集群 Debezium JMX相关的技术博客&#xff1a; Debezium系列之&#xff1a;安装jmx导出器监控debezium指标Debezium系列之&#xff1a;为Debezium集群JMX页面增加监控&a…

DevSecOps实践:如何在研发过程中做好供应链安全

DevSecOps与供应链安全 很多企业都建立了DevOps流程&#xff0c;但安全基本还处在流程之外&#xff0c;没有融入传统DevOps流程&#xff0c;导致安全一直都是敏捷交付的瓶颈。本篇内容我们将从DvSecOps和软件供应链安全的角度来谈谈研发过程中的安全问题。 01 DevSecOps——供…

ODrive电路设计中的接地环路

对于要进行通信的电气设备,大多数时候它们需要公共接地连接。最佳实践是将接地连接回一个点,称为“星形接地”。如果有多个接地路径,则会形成“接地环路”。接地环路和导线电感可能会导致 ODrive 等大电流电子设备出现问题。作为可能出错的示例,请查看下图。 问题: 问题在…

Search space set group switching(二)

欢迎关注同名微信公众号“modem协议笔记”。 R17规定UE可以根据DCI 0_2/0_1/1_1/1_2 的PDCCH monitoring adaptation field 结合具体的配置&#xff0c;对Type3-PDCCH CSS sets 或 USS sets 的acitve DL BWP进行skipping PDCCH monitoring或search space set group switch(包括…

途乐证券|光伏概念发力上扬,好利科技涨停,隆基绿能等拉升

光伏概念28日盘中发力上扬&#xff0c;截至发稿&#xff0c;露笑科技、好利科技、宁波能源等涨停&#xff0c;中国动力、欧晶科技、聚合材料、鹿山新材等涨超5%&#xff0c;帝科股份、隆基绿能、福斯特等涨超3%。 露笑科技昨日晚间披露的半年度业绩预告&#xff0c;预计上半年归…

C++面试需求

一.auto 1.介绍&#xff1a; auto 是一个用于类型推导的关键字。它允许变量的类型在编译时根据其初始化值自动推断 例子&#xff1a; &#xff08;1&#xff09;自动类型推导变量 // C program to demonstrate working of auto // and type inference#include <bits/std…

实验九 单周期MIPS CPU设计实验(基于Logisim)

一、实验目的 学生掌握控制器设计的基本原理&#xff0c;能利用硬布线控制器的设计原理在Logisim平台中设计实现MIPS单周期CPU。 二、实验内容 利用运算器实验&#xff0c;存储系统实验中构建的运算器、寄存器文件、存储系统等部件以及Logisim中其它功能部件构建一个32位MIPS …

初创企业在租赁共享办公室要注意哪些事项

作为一名初创企业负责人&#xff0c;在深圳租赁共享办公室需要注意以下问题&#xff1a; 1. 成本效益&#xff1a;深圳的商业成本往往较高&#xff0c;因此需要仔细评估租赁共享办公室的成本效益&#xff0c;确保其符合公司的预算和需求。 2. 地理位置&#xff1a;选择一个地…

搭载率逼近10%,全年预计突破300万辆,DMS前装势头正猛

55.67万辆&#xff0c;同比增长126.21%&#xff0c;前装搭载率9.84%&#xff0c;这是中国市场&#xff08;不含进出口&#xff09;乘用车在今年1-4月交出的DMS&#xff08;基于视觉感知的驾驶员疲劳预警&#xff09;系统前装标配数据。 目前&#xff0c;除了欧洲市场已经在新车…
最新文章