java基础(六)java线程池(ExecutorService)

jdk下httpserver源码解析   在写这篇博客之前我查了很久发现全网都没有一篇写httpserver源码解析的      所以今天就由我来为大家解析一下httpserver的源码。(这里我会去掉其中的https部分的源码,只讲http部分,对httpserver中https的实现感兴趣的读者可以尝试自己去阅读,这部分并不复杂)      第一次在没有参考资料的情况下写这么长一篇源码解析,可能会有很多错误和讲不清楚的地方,希望大... 阅读详情

1.示例

/** * 线程运行demo,运行时打出线程id以及传入线程中参数 */ public class ThreadRunner implements Runnable { private final SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss.SSS"); /** * 线程私有属性,创建线程时创建 */ private Integer num; public ThreadRunner(Integer num) { this.num = num; } @Override public void run() { System.out.println("thread:" + Thread.currentThread().getName() + ",time:" + format.format(new Date()) + ",num:" + num); try {//使线程睡眠,模拟线程阻塞情况 TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } }

2.FixedThreadPool -- 有一个固定大小的线程池

 

public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(4); for(int i = 0 ; i < 50 ; i++){ pool.submit(new ThreadRunner((i + 1))); } pool.shutdown(); }

该方式中:

--池中线程数量固定,不会发生变化

--使用无界的LinkedBlockingQueue,要综合考虑生成与消费能力,生成过剩可能导致堆内存溢出.

--使用一些很稳定很固定的正规并发线程,多用于服务器.

 

3.CachedThreadPool -- 随机生成线程数量

public static void main(String[] args) { ExecutorService pool = Executors.newCachedThreadPool(); for(int i = 0 ; i < 50 ; i++){ pool.submit(new ThreadRunner((i + 1))); } pool.shutdown(); }

该方式中:

--池中线程数量随着处理数据增加而怎加

--线程数并不是一直增加,如果有新任务需要执行时,首先查询池中是否有空闲的线程并且还为到空闲截止时间,如果有,则使用空闲线程没如果没有,则创建新线程放入池中.

--用于执行一些生存期很短的异步任务,不适用IO等长延时操作,因为这可能会创建大量线程,导致系统崩溃.

--使用SynchronousQueue作为阻塞队列,如果有新任务进入队列,必须队列中数据被其他线程处理,否则回等待.

 

4.Single ThreadExecutor -- 简单顺序执行

public static void main(String[] args) { ExecutorService pool = Executors.newSingleThreadExecutor(); for(int i = 0 ; i < 50 ; i++){ pool.submit(new ThreadRunner((i + 1))); } pool.shutdown(); }

 

--线程中只有一个线程在执行

--适用于有明确执行顺序但是不影响主线程的任务,压入池中的任务会按照队列顺序执行

--适用无界的LinkedBlockingQueue,要综合考虑生成与消费能力,生成过剩,可能导致堆内存溢出.

 

 

5.关键词说明

--corePoolSize:线程池核心线程数量

--1.如果池中线程数量少于核心线程池数量,则直接新建线程处理当前任务

--2.核心线程池空闲不会被回收.

--3.当池中无空闲线程时,新任务将被添加到阻塞队列

--maximumPoolSize: 线程池最大线程数量

--1.当阻塞队列已满,并且有新任务还在入队是,创建新的线程处理,直到线程数大于maximumPoolSize

--2.超出corePoolSize部分的线程超过空闲时间会被回收

--3.当线程已经超过corePoolSize,并且队列容量已满,则拒绝入队

--keepAliveTime unit: 线程存活时间

--1.当线程超出corePoolSize时生效

--2.线程空余keepAliveTime后,将被回收

--workQueue: 线程使用阻塞队列

--ThreadFactory:创建线程池工厂

-用于控制创建线程或者销毁线程时加入其它逻辑

 

 

 

 

 

 

import java.net.InetSocketAddress;

import java.util.List;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import com.sun.net.httpserver.HttpServer;

import com.sun.net.httpserver.HttpHandler;

 

 

public class MyHttpServer{

//初始化server服务器端

private static HttpServer httpServer = null;

//初始化executor线程池

private static ExecutorService executor = null;

public static void start(int port, HttpHandler handler,List<String> paths) throws Exception{

//创建一个随机大小的线程池

executor = Executors.newCachedThreadPool();

//实现HTTP server 其中port为端口号

httpServer = HttpServer.create(new InetSocketAddress(port), 0);

//设置server端的线程池

httpServer.setExecutor(executor);

 

if(paths!=null&&paths.size()>0){

for(int i=0;i<paths.size();i++){

//使用handler来处理/的请求

httpServer.createContext(paths.get(i), handler);

}

}else{

httpServer.createContext("/", handler);

}

//启动服务

httpServer.start();

}

public static void stop() {

executor.shutdown();

httpServer.stop(0);

}

}

 

ExecutorService详解:Java 17线程池管理从零到一 本文深度解析Java 17中ExecutorService线程池管理技术,涵盖线程池核心概念、参数配置、拒绝策略、动态调整及企业级实战案例。通过代码示例详解FixedThreadPool、CachedThreadPool等类型选择,结合监控指标与调优策略,帮助开发者构建高性能、可扩展的并发架构,解决资源竞争与系统过载问题。 阅读详情

相关推荐

STM32F103+AX58100 EtherCAT从站SPI移植实战:CubeMX配置避坑指南

本文详细介绍了STM32F103与AX58100 EtherCAT从站控制器的SPI接口移植实战,重点解析CubeMX配置中的关键参数与常见陷阱。内容涵盖硬件连接规范、SPI模式设置、中断优先级规划及协议栈对接技巧,帮助开发者高效实现工业自动化领域的实时通信方案。特别强调CPOL/CPHA配置与AX58100的匹配要求,避免数据错位问题。

weixin_29230865的博客 331

配置java常用线程池

@Configuration public class ThreadPoolConfig { /** * 获取系统处理器个数,作为线程池数量 */ private final int CPU_NUM = Runtime.getRuntime().availableProcessors(); /** * 使用Guava的ThreadFactoryBuilder线程工厂 */ private final ThreadFactory THR

weixin_45826772的博客 516

GR00TN1.7国内本地下载+模型下在+hugingface无法连接,本地模型下载

GR00TN1.7

alsj123456的博客 97

线程池工厂方法源码分析

里面都是静态方法,为Executor, ExecutorService, ScheduledExecutorService, ThreadFactory, and Callable classes提供工厂方法 创建一个线程池,该线程池重用在共享的无边界队列上运行的固定数量的线程。 在任何时候,最多nThreads个线程是活动的,用于处理任务。如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待直到一个线程可用。如果任何线程由于执行过程中的异常导致在shutdown之前终...

m0_43406494的博客 300

「Debug R」在从名字空间‘XVector’中出口方法时发现了不是S4通用的函数‘parallelSlotNames’...

每当R语言版本更新,Bioconductor的版本随之更替的时候,总会有一些神奇的报错会出现,比如说下面这种。 Error: package or namespace load failed for ‘GenomicRanges’: 在从名字空间‘XVector’中出口方法时发现了不是S4通用的函数‘parallelSlotNames’ 如果读中文读不懂,我们可以把它翻译成英文。 packa...

xuzhougeng blog 2001

Proteus仿真AT89C51驱动DHT11:温湿度数据采集与LCD1602显示的5个调试坑点总结

本文总结了在Proteus仿真环境下使用AT89C51驱动DHT11温湿度传感器并通过LCD1602显示的5个常见调试坑点,包括DHT11时序问题、LCD1602初始化错误、数据校验失败、仿真特有差异及系统稳定性问题,提供了详细的解决方案和优化代码示例,帮助开发者高效完成温湿度采集项目。

weixin_30335575的博客 356

面试题——线程池

1.为什么要用线程池 创建线程和回收线程都会占用系统资源,如果任务来了才创建线程那么响应时间会变长。提前创建一些线程并交给线程池管理,可以降低资源消耗、提高响应速度、提高线程的可管理性。 2. 线程池执行流程(原理) 如果当前运行的线程少于corePoolSize,则创建新线程来执行任务,这一步骤需要获取全局锁。 如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQu...

dl674756321的博客 6377

LLC谐振变换器软启动,不只是“慢启动”,还是“智能启动”

LLC谐振变换器的软启动,不只是“慢慢来”,而是要在控制时序、限流、响应速度之间精妙权衡。而数字控制,特别是用查表法或混合信号法,为实现真正的“最佳轨迹”提供了可能。✨小Tips:如果你的系统成本敏感,选择查表法准没错;如果你的设计目标是超高速响应,那就上混合信号的高配方案!

weixin_43199439的博客 691

java实现http服务器_使用Java实现简单的Http服务器

在Java中可以使用HttpServer类来实现Http服务器,该类位于com.sun.net包下(rt.jar)。实现代码如下:主程序类package bg.httpserver;import com.sun.net.httpserver.HttpServer;import java.io.IOException;import java.net.InetSocketAddress;import ...

weixin_39612058的博客 1273

高德地图API如何使用

通过以上步骤,您可以成功接入并使用高德地图API来为您的应用添加丰富的地图功能。

QQ_778132974的博客 4786

后仿真中《SDF反标必懂连载篇》之 Negative Delay (理论篇)

今天,学习一下SDF文件中的负数延时问题。比如下面的图片中的SETUPHOLD 中的hold time 为负数。

那么菜的博客 2577

Java线程池ExecutorService

目录1 ExecutorService介绍2 ExecutorService的创建3 ExecutorService的使用4 ExecutorService的执行4.1 execute(Runnable)4.2 submit(Runnable)4.3 submit(Callable)4.4 invokeAny(…)4.5 invokeAll(…)5 ExecutorService的关闭6 项目中的使用 1 ExecutorService介绍 本篇主要涉及到的是java.util.concurrent包中的

赵广陆 2万+

导航系统 | 全球四大卫星导航系统(2025)核心能力对比分析

北斗系统通过GEO卫星(80°E、110.5°E、140°E)实现区域增强,其IGSO卫星在亚太地区形成"8"字形轨迹,使该区域可见卫星数量比GPS多4-6颗,显著提升复杂环境下的定位可用性[13]。北斗短报文功能在2025年云南地震救援中发挥关键作用,被困人员通过北斗终端发送120字求救信息,实现"位置+状态"一体化上报,救援响应时间缩短40%[15]。北斗通过三频信号(B1C/B2a/B3)消除电离层延迟误差,在城市峡谷环境下定位连续性达99.98%,优于GPS的99.95%[5]。

尘世冰封的专栏 2614

Java线程池ExecutorService学习和使用

线程池中有3个线程 (pool-1-thread-1、pool-1-thread-2 和 pool-1-thread-3),每个线程可以同时执行一个任务。如果需要每个任务执行之后需要返回一个结果,可以实现Callable接口并重写call方法。每个任务执行的过程包括打印任务开始的信息、模拟执行2秒、打印任务完成的信息。每个任务执行2秒,然后完成,接着线程池中的线程会继续执行等待中的任务。前3个任务会立即被分配给线程池中的3个线程并开始执行。使用一个固定大小为3的线程池来并发执行这些任务。

Dd_ddc的博客 3664

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java线程池 ExecutorService

一、ExecutorService介绍 ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法: Java API对ExecutorService接口的实现有两个,所以这两个即是Java线程池具体实现类: ThreadPoolExecutor ScheduledThreadPoolExecutor ExecutorService还继承了Executor接口(注意区分Executor接口和Execu

qq_40056060的博客 5844

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java 线程池与 ExecutorService 详解

在多线程编程中,线程池是一种非常重要的技术,它可以有效地管理线程的生命周期,减少线程创建和销毁的开销,并提高程序的性能。Java 提供了 `ExecutorService` 接口和 `Executors` 工具类来简化线程池的使用。本文将详细介绍线程池的概念、使用方法以及注意事项。

李长渊的博客 1337

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java ExecutorService线程池使用(ExecutorService/Completable异步+ExecutorService线程池)

使用自定义配置的线程池,// 核心线程数// 最大线程数// 非核心线程空闲存活时间// 有界队列// 拒绝策略,默认就是拒绝策略// 创建自定义线程池unit,workQueue,handler// 创建自定义线程池(周期性执行)unit,workQueue,handlerCPU 密集型:CPU 核心数 + 1(减少上下文切换)IO 密集型:2 * CPU 核心数(线程常阻塞,需更多线程)根据系统资源设置,避免资源耗尽(如 corePoolSize * 1.5)

abcnull 的博客 1483

Java中如何正确的关闭线程池ExecutorService

概念 ExecutorService关于关闭主要有如下几个方法 shutdown:在线程池队列中的提交的任务会执行,无法提交新的任务,注意调用这个方法,线程池不会等待(wait)在执行的任务执行完成,可以使用awaitTermination实现这个目的。这里需要注意的是:在执行的任务因为是异步线程执行的,任务还是会继续执行,只是说线程池不会阻塞等待任务执行完成 List<Runnable&...

zlp1992的专栏 8903

Java线程池 ExecutorService、ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService。利用这两个类,可以创建各种不同的Java线程池,为了方便我们创建线程池,Java API提供了Executors工厂类来帮助我们创建各种各样的线程池。下面我们分别介绍一下这三个类。 Java线程池ExecutorService继承树: 1、ExecutorService介绍 ExecutorService是Java中对线.

Janson_Lin 2404

Java 中的 ExecutorService 与线程池管理

是 Java 并发包 () 中的一个接口,主要用于管理线程池。与手动创建线程的方式不同,它将任务提交给线程池,并管理这些线程的生命周期。通过,我们可以轻松控制线程的创建、执行、关闭等操作。:提交任务给线程池执行,返回一个Future,代表任务的执行结果。shutdown():有序关闭线程池,不再接受新的任务,但会完成已提交的任务。:立即关闭线程池,并尝试中断正在执行的任务。:执行多个任务,等待所有任务完成并返回结果。:执行多个任务,只要其中一个任务完成,就返回该任务的结果。通过。

qq_40697623的博客 1189

Java线程池 Executors 和 ExecutorService 详解

只负责创建,用完就"丢"

y2222_的博客 982

在spring boot中使用java线程池ExecutorService的讲解

认识java线程池 1.1 在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.需处理的任务的数量大 1.2 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存 1.3 线程池包括以下四个基本组成部分: 1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池...

weixin_44782075的博客 3617

java的线程池-ExecutorService

目录结构ExecutorService继承树原理相关参数ThreadPoolExecutor参数corePoolSize、maximumPoolSize、RejectedExecutionHanderkeepAliveTime、TimeUnitworkQueneRejectedExecutionHander创建ExecutorService ExecutorService 继承树 ExecutorService是java对线程池定义的一个接口,也是java默认给我们的,它具有两个实现类: ThreadP

@@老胡的博客 834

线程池 ExecutorService 详细介绍以及注意点区别

线程池 ExecutorService 相信java开发都用到,这里做个简单笔记一 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 newS

chenaini119的专栏 3万+
上一篇: java基础(七)HttpExchange
下一篇: logback日志
GQ_YIN
博客等级 码龄11年 2321粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值