Java线程池与ExecutorService教程:原理、应用与配置选项

Java多线程并发编程系列-00 线程池原理与自定义实现线程池 本文探讨了Java多线程并发编程中的线程池原理与实现。多线程的核心目的是充分利用CPU资源并发执行任务,但线程并非越多越好,需权衡创建/销毁开销、内存消耗及上下文切换成本。线程池通过固定数量的工作线程和任务队列(BlockingQueue)实现高效任务调度:任务提交到队列,空闲线程获取任务执行。针对计算型与IO型任务,线程数需动态调整(如CPU核数的1-2倍或更高)。文中还实现了一个简易线程池(FixedSizeThreadPool),包含任务队列、工作线程集合及关闭逻辑,并对比了阻塞(put/ta 阅读详情

多线程是Java中常用的技术,它可以提高程序的性能和并发处理能力。然而,直接使用Java中的Thread类创建和管理线程存在一些缺点,例如线程创建和销毁的开销很大,线程池的数量不易控制,易出现内存泄漏等问题。因此,Java提供了Executor框架和ExecutorService接口来解决这些问题。

本文将介绍Java ExecutorService和线程池的原理和应用,同时提供相应的Java代码示例。

ExecutorService的原理

ExecutorService是Java中的一个接口,它继承了Executor接口,并添加了一些方法,用于管理线程池。线程池是一组线程的集合,用于处理多个任务。使用线程池可以避免频繁创建和销毁线程,减少系统的开销。

ExecutorService的原理主要包括线程池的创建和使用。线程池可以通过ThreadPoolExecutor类或Executors类的工厂方法来创建。其中,ThreadPoolExecutor类提供了更丰富的线程池配置选项,而Executors类提供了一些预定义的线程池。

线程池的使用可以通过submit()方法或execute()方法来提交任务。submit()方法可以提交一个Callable或Runnable类型的任务,并返回一个Future对象,用于获取任务的执行结果。execute()方法可以提交一个Runnable类型的任务,不返回任务的执行结果。

ExecutorService的应用

ExecutorService主要应用于多任务并发处理和线程池管理。下面将介绍一些常用的ExecutorService应用场景和示例。

单任务的线程池

如果需要执行一个单一的任务,可以使用线程池来管理该任务的执行。线程池可以通过Executors类的静态方法来创建,如下所示:

ExecutorService executor = Executors.newFixedThreadPool(1);
executor.execute(new Runnable() {
    @Override
    public void run() {
        // 执行任务
    }
});
executor.shutdown();

上述代码中,创建了一个固定大小为1的线程池,使用execute()方法提交了一个Runnable类型的任务,最后使用shutdown()方法关闭线程池。

并发执行多个任务

如果需要并发执行多个任务,可以使用ExecutorService来管理多个任务的执行。ExecutorService提供了submit()方法来提交多个任务,并返回一个Future对象,用于获取任务的执行结果。示例如下:

ExecutorService executor = Executors.newFixedThreadPool(5);
List<Future<String>> futureList = new ArrayList<>();

for (int i = 0; i < 10; i++) {
    int taskNum = i;
    Future<String> future = executor.submit(new Callable<String>() {
        @Override
        public String call() throws Exception {
            return "Task " + taskNum + " is running.";
        }
    });
    futureList.add(future);
}

executor.shutdown();

for (Future<String> future : futureList) {
    System.out.println(future.get());
}

上述代码中,创建了一个固定大小为5的线程池,使用submit()方法提交了10个Callable类型的任务,返回的Future对象添加到futureList中。最后使用shutdown()方法关闭线程池,使用get()方法获取任务的执行结果并输出。

定时执行任务

如果需要定时执行任务,可以使用ScheduledExecutorService来管理任务的执行。ScheduledExecutorService继承了ExecutorService接口,并添加了一些方法,用于定时执行任务。示例如下:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        // 执行任务
    }
}, 0, 1, TimeUnit.SECONDS);

上述代码中,创建了一个单一的ScheduledExecutorService,使用scheduleAtFixedRate()方法提交一个Runnable类型的任务,定时执行任务,每隔1秒钟执行一次。

线程池的配置选项

ThreadPoolExecutor类提供了一些线程池的配置选项,可以用于调整线程池的行为。以下是一些常用的配置选项:

  • corePoolSize:线程池的核心线程数,用于处理大部分的任务。当任务数超过核心线程数时,线程池会创建新的线程,直到线程池的最大线程数达到上限。
  • maximumPoolSize:线程池的最大线程数,用于处理任务的峰值。当任务数超过最大线程数时,线程池会将任务放入等待队列中,等待空闲线程的处理。
  • keepAliveTime:空闲线程的存活时间。当线程池中的线程处于空闲状态且超过了keepAliveTime时长时,线程池会将线程回收。
  • TimeUnit:时间单位,用于指定keepAliveTime的时间单位。
  • workQueue:等待队列,用于存储等待处理的任务。线程池提供了多种类型的等待队列,例如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等。
  • RejectedExecutionHandler:拒绝策略,用于处理无法处理的任务。线程池提供了多种类型的拒绝策略,例如AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy等。

总结

本教程介绍了Java ExecutorService和线程池的原理和应用,包括线程池的创建、使用、配置选项和拒绝策略。ExecutorService和线程池是Java中常用的多线程编程技术,能够提高程序的性能和并发处理能力,同时减少系统的开销。熟练掌握ExecutorService和线程池的应用,可以为Java程序的开发和优化提供很大的帮助。

【项目实战】并发编程之线程池(ExecutorService接口与Executors), Java标准库提供的线程池实现 在Java中,线程池是一种常见的并发编程模型Java线程池是Java应用程序中管理线程的强大工具。 阅读详情

相关推荐

Java中ExecutorService线程池的使用(Runnable和Callable多线程实现)

线程的创建和释放,需要占用不小的内存和资源。如果每次需要使用线程时,都new 一个Thread的话,难免会造成资源的浪费,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。不利于扩展,比如如定时执行、定期执行、线程中断,所以很有必要了解下ExecutorService的使用。ExecutorService是Java提供的线程池,也就是说,每次我们需要使用线程的时候,可以通过ExecutorService获得线程。...

BADAO_LIUMANG_QIZHI的博客 8210

【JUC线程池】ExecutorService以及Executors线程池类型

线程池创建concurrent是Java的并发包。我认为当我们了解关于Java的多线程,就应该知道线程池从何而来:是为了解决在的环境下,对于下所以才会有线程池的概念。所以第一部就要先了解如何创建线程池。线程池创建初次了解线程池肯定会了解到ThreadPoolExecutor类,其内部有四种有参构造方法均是为了创建线程池。接下来主要示范的是七个形参的构造方法。:如果创建的线程数未达到指定的核心线程数,则会继续创建新的核心线程数达到指定值,而后创建的线程均不为核心线程,而是非核心线程。

m0_65563175的博客 948

Oracle EBS R12.2 安装 -- Step by Step

Oracle EBS R12.2 安装 -- Step by Step

Albert Tan DBA之路 1514

线程池(Java版)

程序中如果需要使用线程,将一个执行任务传给线程池,线程池就会使用一个空闲状态的线程来执行这个任务。1)) 工作队列未满时,线程池将该任务放入工作队列中等待,当线程池中出现空闲队列时, 将该任务从工作队列中调出,交给该空闲线程执行;3. STOP:停止状态。线程池调用shutdownnow()方法,进入停止状态,此时线程池不会接受新任务,也不会处理工作队列中的任务,而且会中断工作队列中的任务。1. 向线程池提交一个新的线程任务,线程池会分配一个空闲线程来执行这个任务。

weixin_52572813的博客 449

Pintos project 1 实验报告(代码分享)

任务一 Alarm Clock 用到的相干目录有: pintos/src/devices time.h && time.c pintos/src/threads thread.h && thread.c 预期pass希望:暂无,安装pintos之后,第一次对threads进行make check操作,可以发现以alarm--开头的前六个文件,以及mlfqs-fair-2和mlfqs-fair-20文件,一开始就测试成功pass。但是为了避免对后期的修改有影响,这里还是要

m0_53112875的博客 6869

自动化学报Ctex+texstudio配置方法

自动化学报Latex的模板win10使用方法(CTEX+texstudio)

zxy15924462502的博客 7376

Java/ExecutorService中多线程服务ExecuteService的使用

ExecutorService 是 Java 中的一个接口,它扩展了 Executor 接口,并提供了更多的方法来处理多线程任务。它是 Java 中用于执行多线程任务的框架之一,可以创建一个线程池,将多个任务提交到线程池中执行。ExecutorService 接口提供了许多方法,如 shutdown()、shutdownNow()、submit()、execute()、invokeAll() 等,可以更方便地提交任务、执行任务、关闭线程池等操作。

★【World Of Moshow 郑锴】★ 4458

RocketMq面板访问异常 com.alibaba.fastjson.JSONException: not close json text, token : string

rocketmq JSONException: not close json text, token : string 问题解决

qq_21067307的博客 5573

重温JAVA线程池精髓:Executor、ExecutorService及Executors的源码剖析与应用指南

在Java并发编程中,线程池是一个非常重要的概念。它可以帮助我们更好地管理和控制线程的使用,避免因为大量线程的创建和销毁带来的性能开销。Java的java.util.concurrent(简称JUC)包中提供了一套丰富的线程池工具,包括Executor接口、ExecutorService接口以及Executors工厂类等。本文将详细介绍这些工具的使用和原理,帮助大家更好地理解和应用Java中的线程池技术

码到三十五 3920

阿里云一键登录Java后端实战:5分钟搞定号码认证服务集成(附完整代码)

本文详细介绍了如何在Java后端项目中快速集成阿里云号码认证服务(PNVS),实现高效、安全的一键登录功能。文章从核心架构、安全机制解析入手,提供了完整的Maven依赖配置、服务端环境准备、核心业务逻辑实现(包括Token验证、用户处理、异常降级)以及生产环境下的性能优化、监控与部署方案,并附有可直接使用的完整代码示例。

p1q2r的博客 846

成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred

成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred. 目录 解决问题 解决思路 解决方法 解决问题 安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred. 解决思路 发生未知错误。 解决方法 很可能是因为当前电脑下载的cuda版本不适合当前电脑GPU支持的cuda版本! 推荐文章:CV:Win1..

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 7525

深入探索Java线程池技术:原理与实践

Java线程池作为一种强大的多线程编程工具,通过java.util.concurrent.ExecutorService接口及其核心实现类ThreadPoolExecutor,提供了线程的管理和任务调度功能。在Java并发编程中,线程池可以根据预设的参数(如核心线程数、最大线程数、线程存活时间、任务队列和拒绝策略)动态调整线程数量,有效避免了线程创建销毁带来的开销,提高了系统资源利用率和并发性能。

聚焦于深度解析最新的编程语言特性、框架升级、架构设计、开发工具和最佳实践,涵盖Web前端(如Vue3, React, Angular等)、后端开发(如Node.js, Java, Python等)、移动端开发(iOS, Android原生及跨平台开发) 3万+

eye-in-hand手眼标定系统

上一个博文说了一种手眼标定系统的特殊情况,就是相机随着机械手一起移动的情况。虽然前面简单介绍了一种办法,就是内次拍照时让相机回到之前标定的位置,但是这样处理机器人的工作效率就会大大降低,产生很多重复动作,所以这篇博文就来讲一种更简单的标定方案。 下面是halcon官方给的手眼标定系统的案例代码。 这个例子主要应用于相机固定在机械手末端的手眼系统中,而且标定板相对于机器人也是静止的。 在这...

二毛的博客 1万+

线程池(ThreadPool):使用ExecutorService、ThreadPoolExecutor等线程池管理并发任务以及底层实现原理

核心线程数,当提交任务时,如果当前线程数小于核心线程数,即使线程池中有空闲线程,也会创建新的线程来执行任务。:线程池的最大线程数,当任务队列已满且线程数小于最大线程数时,线程池会创建新线程来执行任务。:非核心线程的空闲时间超过此时间后将被终止(如果当前线程数大于workQueue:任务队列,用于存放等待执行的任务。:有界队列,任务达到队列上限时,新的任务将被阻塞或拒绝。:无界队列,适合任务量较大的场景。:没有容量的队列,提交的任务必须直接交给线程执行,否则会创建新线程。

Flying_Fish_roe的博客 1835

2.1 直流无刷电机(BLDC):机械结构与组件

本文详细解析了直流无刷电机(BLDC)的机械结构与核心组件。BLDC电机通过电子换向取代传统机械电刷,主要包含定子、转子、位置传感器和电子换向器四大组件。定子采用硅钢片叠压结构,配有三相绕组;转子采用永磁体材料,结构设计影响转矩特性;位置传感器(霍尔、编码器、旋转变压器)实现精准换向;电子换向器通过功率逆变拓扑完成电流控制。文章还对比了不同绕组类型、永磁材料及传感器技术的性能特点,为BLDC电机的设计与应用提供了理论基础。

技术工作者 392

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java线程池详解:ExecutorService、ThreadPoolExecutor、Executors

线程池就是一个可以复用线程的技术。多线程不使用线程池带来的问题 如果用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来了又要创建新线程,而创建新线程的开销是很大的,这样会严重影响系统的性能。线程池的工作原理谁代表线程池 JDK 5.0起提供了代表线程池的接口:ExecutorService。方式一:使用ExecutorService的实现类ThreadPoolExecutor自创建一个线程池对象; 方式二:使用Executors(线程池......

斯文~ 1824

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java的线程池-ExecutorService

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

@@老胡的博客 834

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java進階:ExecutorService 線程池

Java 進階:ExecutorService 線程池 文章目錄Java 進階:ExecutorService 線程池簡介參考正文Thread 野線程繼承 Thread實現 RunnableLambda 表達式實現 RunnableExecutorService 接口ThreadPoolExecutor 實現類Executors 工廠方法語法newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutornewScheduledThreadPoolMe

超悠閒的博客 754

【Java线程】Java线程池ExecutorService

// 创建可以容纳3个线程的线程池 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); // 线程池的大小会根据执行的任务数动态分配 ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); // 创建单个线程的线程池,

Alpha's 学习笔记 5万+

Java线程池原理及四种线程池的使用

Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执

honghailiang的专栏 1万+

深入理解 Java 线程池:从原理到实践

线程池的核心价值在于平衡资源利用率与系统稳定性:通过复用线程降低创建开销,通过参数配置控制并发边界,通过拒绝策略防止系统崩溃。理解ThreadPoolExecutor的参数含义与工作流程,是写出高效、健壮并发代码的关键。在实际开发中,应根据任务特性(CPU 密集型 / IO 密集型)、系统资源限制(内存 / CPU 核心数)等因素量身定制线程池配置,避免盲目使用 Executors 的默认实现。

2301_77880989的博客 2196

FutureTask与ExecutorService:Java面试中启动任务的秘密

深入解析Java面试中常见的任务启动机制,探讨FutureTask与ExecutorService的核心功能及应用场景。从线程管理到异步任务执行,揭秘这两者在并发编程中的重要性,帮助开发者高效利用资源、优化任务调度。了解它们的实现原理和使用技巧,助力你在复杂场景下编写更优雅、高效的代码。

yanpeng2580的博客 969

Java线程池ExecutorService

多线程概念和相关包: 线程池:提供一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁的额外开销,提高了响应的速度。 线程池的体系结构: java.util.concurrent.Executor 负责线程的使用和调度的根接口 |--ExecutorService 子接口: 线程池的主要接口 |--ThreadPoolExecutor...

jc_benben的专栏 233

java executor spring_java 线程池(ExecutorService与Spring配置threadPoolTaskExecutor)

一、java ExecutorService实现创建ExecutorService变量private ExecutorService executor = null2.执行对应任务时,首先生成线程池executor = Executors.newFixedThreadPool(线程池大小);3.循环执行线程for (String str : ids) {executor.submit(new Ca...

weixin_35719380的博客 307

Java 线程池核心原理

线程池是一种管理和复用线程的机制,它可以在需要执行任务时分配线程,执行完任务后将线程放回线程池中,以便重复利用。线程池可以有效地控制并发线程的数量,提高系统的性能和资源利用率。

qq_45607784的博客 1412

java 线程池与executor_Java线程池_Executor与ExecutorService原理分析

在java中我们想在新线程中执行一个任务很简单,有以下两种方式:// 1. 将任务放在Runnable的run方法中Thread thread = new Thread(new Runnable() {@Overridepublic void run() {// 执行任务}});thread.start();// 2. 将任务放在Thread的run方法中Thread thread = new T...

weixin_29009669的博客 418
上一篇: Java 中使用数组存储和操作数据
下一篇: Java 8中的Stream API
青年老年程序员
博客等级 码龄18年 7013粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值