java四种内置线程池介绍

目录

    • java线程池概述
      • `Executor`接口
      • `ExecutorService`接口
    • 工具类快速创建线程池
      • FixedThreadPool
      • SingleThreadExecutor
      • CachedThreadPool
      • ScheduledThreadPool
      • 内置线程池总结

java线程池概述

Executor框架是Java提供的一个用于处理并发任务的工具。它简化了线程管理,提供了一个更高层次的任务执行模型。Executor框架的核心组成部分包括Executor接口、ExecutorService接口以及ScheduledExecutorService接口。下面是这些组件的详细介绍:

Executor接口

Executor是Java并发框架中的基础接口,用于提交任务。它有一个方法:

java复制代码
void execute(Runnable command);

这个方法接收一个Runnable对象,并在某个线程中执行它。Executor接口并不提供任务完成后的反馈机制,它只是将任务提交到线程池中执行。

ExecutorService接口

ExecutorService接口继承了Executor接口,提供了一些额外的方法来管理和控制线程池的生命周期。主要的方法包括:

  • submit(Runnable task): 提交一个Runnable任务,并返回一个Future对象,允许你在将来获取任务的执行结果或异常。
  • submit(Callable<T> task): 提交一个Callable任务,并返回一个Future<T>对象,允许你获取任务的结果。
  • invokeAll(Collection<? extends Callable<T>> tasks): 提交一组Callable任务,并返回一个List<Future<T>>对象,表示任务的执行结果。
  • invokeAny(Collection<? extends Callable<T>> tasks): 提交一组Callable任务,并返回第一个成功完成的任务的结果。
  • shutdown(): 启动一次平滑关机,停止接收新任务,但会继续执行已经提交的任务。
  • shutdownNow(): 立即关闭,尝试停止所有正在执行的任务,返回未执行的任务列表。

Executor框架关系图:
在这里插入图片描述

线程池常用方法:

//使用工具类创建线程池
ExecutorService executor1 = Executors.newFixedThreadPool(3);//定义任务
Runnable task = ()->{System.out.println("线程"+Thread.currentThread().getName()+"正在执行");
};executor.excute(XXX); //执行任务,没有返回值
executor.submit(XXX);//执行任务,返回一个Future,用于获取线程的执行情况executor.shutdown();//正常关闭,停止提交新任务,而已提交的任务可以正常执行,非阻塞
executor.shutdownNow();//立即强制关闭,停止提交新任务,正在运行的任务停止,等待队列也销毁,非阻塞
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); // 阻塞等待所有任务完成并且shutdown,如果超过到达时间,则返回false

当等待队列是无界队列时,非核心线程会创建吗?

不会,因为非核心线程只有在队列满的时候才会创建,使用了无界队列就相当于默认只有核心线程生效

工具类快速创建线程池

Executors是一个工具类,可以快速创建线程池,它支持四种创建方式

    public static void main(String[] args) {long start = System.currentTimeMillis();ExecutorService executor1 = Executors.newFixedThreadPool(3);//固定线程池,线程不变ExecutorService executor2 = Executors.newCachedThreadPool();//缓冲线程池,自由伸缩ExecutorService executor3 = Executors.newSingleThreadExecutor();//单线程池,FIFOScheduledExecutorService  executor4 = Executors.newScheduledThreadPool (5);// 调度线程池,用于实现定时任务、周期任务}

FixedThreadPool

使用示例:

    private static void runFixedThreadPoolExample() {long startTime = System.currentTimeMillis(); // 记录开始时间// 创建一个固定大小的线程池,线程池大小为3ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);// 提交10个任务到线程池for (int i = 0; i < 10; i++) {final int taskId = i;fixedThreadPool.execute(() -> {System.out.println("FixedThreadPool: 任务 " + taskId + " 在 " + Thread.currentThread().getName() + " 执行");try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {e.printStackTrace();}});}fixedThreadPool.shutdown(); // 关闭线程池,停止接受新任务try {fixedThreadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); // 等待所有任务完成} catch (InterruptedException e) {e.printStackTrace();}long endTime = System.currentTimeMillis(); // 记录结束时间System.out.println("FixedThreadPool 运行时长: " + (endTime - startTime) + " 毫秒"); // 打印运行时长}

底层参数:

    public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}

特点:

  • 核心线程数和最大线程数大小一样,没有所谓的非核心线程的空闲时间
  • 阻塞队列为无界队列LinkedBlockingQueue,可能会导致OOM

使用场景:适用于任务数量相对固定且执行周期长的任务。因为创建的都是核心线程,会一直存在,所以如果是短周期任务的话,比较浪费资源。任务并发量不确定的情况也最好不用。

SingleThreadExecutor

使用示例:

private static void runSingleThreadExecutorExample() {long startTime = System.currentTimeMillis(); // 记录开始时间// 创建一个单线程的线程池ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();// 提交5个任务到线程池for (int i = 0; i < 5; i++) {final int taskId = i;singleThreadExecutor.execute(() -> {System.out.println("SingleThreadExecutor: 任务 " + taskId + " 在 " + Thread.currentThread().getName() + " 执行");try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {e.printStackTrace();}});}singleThreadExecutor.shutdown(); // 关闭线程池,停止接受新任务try {singleThreadExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); // 等待所有任务完成} catch (InterruptedException e) {e.printStackTrace();}long endTime = System.currentTimeMillis(); // 记录结束时间System.out.println("SingleThreadExecutor 运行时长: " + (endTime - startTime) + " 毫秒"); // 打印运行时长}

底层参数:

    public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}

特点:

  • 核心线程数和最大线程数都是1,即只用一个线程去执行所有任务
  • 阻塞队列是无界队列LinkedBlockingQueue,可能会导致OOM

使用场景:当要实现串行执行任务,满足排队执行时

CachedThreadPool

使用示例:

private static void runCachedThreadPoolExample() {long startTime = System.currentTimeMillis(); // 记录开始时间// 创建一个可缓存的线程池ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 提交10个任务到线程池for (int i = 0; i < 10; i++) {final int taskId = i;cachedThreadPool.execute(() -> {System.out.println("CachedThreadPool: 任务 " + taskId + " 在 " + Thread.currentThread().getName() + " 执行");try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {e.printStackTrace();}});}cachedThreadPool.shutdown(); // 关闭线程池,停止接受新任务try {cachedThreadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); // 等待所有任务完成} catch (InterruptedException e) {e.printStackTrace();}long endTime = System.currentTimeMillis(); // 记录结束时间System.out.println("CachedThreadPool 运行时长: " + (endTime - startTime) + " 毫秒"); // 打印运行时长}

底层参数:

    public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}

特点:

  • 核心线程数为0,所有线程都是非核心线程,空闲后最多存活60秒
  • 最大线程数为Integer.MAX_VALUE,即无限大,可能会因为无限创建线程,导致OOM
  • 阻塞队列是SynchronousQueue,这个队列的size为1,也就是每提交一个任务,队列都会满,进而就都会创建一个非核心线程

使用场景: 执行并发量大且事件短的小任务需要快速响应的场景

ScheduledThreadPool

使用示例:

    private static void runScheduledThreadPoolExample() {long startTime = System.currentTimeMillis(); // 记录开始时间// 创建一个调度线程池,线程池大小为2ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);// 延迟任务,2秒后执行scheduledThreadPool.schedule(() -> {System.out.println("延迟任务执行: 线程 " + Thread.currentThread().getName() + " 执行了延迟任务");}, 2, TimeUnit.SECONDS);// 周期任务,立即开始执行,每5秒执行一次scheduledThreadPool.scheduleAtFixedRate(() -> {System.out.println("周期任务执行: 线程 " + Thread.currentThread().getName() + " 执行了周期任务");}, 0, 5, TimeUnit.SECONDS);// 让主线程运行一段时间,以便观察周期任务的执行try {Thread.sleep(20000); // 主线程睡眠20秒} catch (InterruptedException e) {e.printStackTrace();}long endTime = System.currentTimeMillis(); // 记录结束时间System.out.println("ScheduledThreadPool 运行时长: " + (endTime - startTime) + " 毫秒"); // 打印运行时长}

底层参数:

    public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,new DelayedWorkQueue());}

特点:

  • 核心线程数可自定义,而最大线程数是Integer.MAX_VALUE,所以也有OOM的风险
  • 阻塞队列是DelayedWorkQueue,按照预期开始时间进行排序
  • scheduleAtFixedRate() :按某种速率周期执行
  • scheduleWithFixedDelay():在某个延迟后执行

使用场景:当要执行延时任务或者周期性任务时

内置线程池总结

总结四种线内置程池都相对比较极端,具体如下:

  • FixedThreadPool:固定线程池,只有核心线程,线程完全固定
  • CachedThreadPool:缓冲线程池,只有非核心线程,线程完全弹性
  • SingleThreadExecutor:单线程池,只能实现排队等待,完全没有并发
  • ScheduledThreadPool:调度线程池,实现延时任务和周期任务,非核心线程数没有上限

注意:《阿里巴巴java开发手册》中明确禁止使用工具类的创建方式,因为线程池的参数不明确,所以不推荐使用工具类创建线程池

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143245.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

用Python实现时间序列模型实战——Day 24: 时间序列中的贝叶斯方法

一、学习内容 1. 贝叶斯时间序列分析的基本概念 贝叶斯方法基于贝叶斯统计&#xff0c;通过对数据的先验分布和似然函数进行推断&#xff0c;更新为后验分布。贝叶斯时间序列分析使用贝叶斯推断处理时间序列中的不确定性&#xff0c;适合处理复杂、不确定性高的时间序列问题。…

【RabbitMQ】可靠性传输

概述 作为消息中间件来说&#xff0c;最重要的任务就是收发消息。因此我们在收发消息的过程中&#xff0c;就要考虑消息是否会丢失的问题。结果是必然的&#xff0c;假设我们没有采取任何措施&#xff0c;那么消息一定会丢失。对于一些不那么重要的业务来说&#xff0c;消息丢失…

中秋佳节,月圆人团圆

文章目录 历史和文化起源与演变文化内涵习俗与活动 军事中秋节的军事背景中秋节的军事象征现代军营中的中秋节 月圆之夜&#xff0c;共赏婵娟传统文化&#xff0c;薪火相传团圆时刻&#xff0c;温馨满溢展望未来&#xff0c;祈愿美好 在这个金秋送爽、丹桂飘香的季节里&#xf…

web基础—dvwa靶场(五)File Upload

File Upload(文件上传) 上传的文件对 web 应用程序来说是一个巨大的风险&#xff0c;许多攻击的第一步是上传攻击代码到被攻击的系统上&#xff0c;然后攻击者只需要找到方法来执行代码即可完成攻击。也就是是说&#xff0c;文件上传是攻击者需要完成的第一步。 不受限制的文件…

Java或者前端 实现中文排序(调API的Demo)

目录 前言1. 前端2. Java 前言 前端 Vue 中的中文排序通常使用 JavaScript 提供的 localeCompare 方法来比较中文字符串 Java 后端可以使用 Collator 类来实现中文排序 1. 前端 在 Vue 中&#xff0c;使用 localeCompare 来实现中文字符串的排序&#xff1a; <template&…

如何在webots中搭建一个履带机器人

前期准备 下载webotswebots基本知识 a. 官方文档:Webots documentation: Track b. B站教程:webots-超详细入门教程(2020)_哔哩哔哩_bilibili搭建流程 搭建履带机器人主要使用到了webots中的track节点,这个节点是专门用来定义履带的相关属性,模拟履带运动的 首先,创建一个…

软考高级:嵌入式-嵌入式实时操作系统调度算法 AI 解读

讲解 嵌入式实时操作系统中的调度算法主要用于管理任务的执行顺序&#xff0c;以确保任务能够在规定时间内完成。针对你提到的几种调度算法&#xff0c;我会逐一进行通俗解释。 生活化例子 假设你在家里举办一个家庭聚会&#xff0c;家里人轮流使用一个游戏机玩游戏。你作为…

实例讲解使用Matlab_Simulink整车模型进行车速控制策略仿真测试验证方法

在进行VCU软件开发过程中&#xff0c;经常要设置一些扭矩控制相关的参数&#xff0c;一般可以通过经验先设置一版参数&#xff0c;然后通过与整车模型的联合仿真及实车标定优化相关参数&#xff0c;最终得到一版综合性能最优的参数作为最终程序定版参数。本文通过蠕行扭矩控制模…

C++八股文之STL篇

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 思维导图链接&#xff1a;STL 持续更新中…… &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64…

[Python]一、Python基础编程

F:\BaiduNetdiskDownload\2023人工智能开发学习路线图\1、人工智能开发入门\1、零基础Python编程 1. Python简介 Python优点: 学习成本低开源适应人群广泛应用领域广泛1.1 Python解释器 下载地址:Download Python | Python.org 1.2 Python开发IDE -- Pycharm 2. 基础语法…

数据权限的设计与实现系列9——前端筛选器组件Everright-filter集成框架开发2

功能实现 ‍ 规则转换为 SQL 片段‍ 规则解析 首先我们来构造一个典型的规则&#xff0c;包括两个条件组&#xff0c;每个组由两个条件组成&#xff0c;由且与或两种逻辑关系&#xff0c;如下图&#xff1a; 然后看看生成的规则&#xff0c;如下&#xff1a; {"filt…

合宙Air201模组LuatOS:PWRKEY控制,一键解决解决关机难问题

不知不觉间&#xff0c;我们已经发布拉期课程&#xff1a;hello world初体验&#xff0c;点灯、远程控制、定位和扩展功能&#xff0c;你学的怎么样&#xff1f;很多伙伴表示已经有点上瘾啦&#xff01;合宙Air201&#xff0c;如同我们一路升级打怪的得力法器&#xff0c;让开发…

计算机的错误计算(九十六)

摘要 探讨 的计算精度问题。 计算机的错误计算&#xff08;五十五&#xff09;与&#xff08;七十八&#xff09;分别列出了 IEEE 754-2019 中的一些函数与运算。下面再截图给出其另外3个运算。 例1. 已知 x-0.9999999999966 . 计算 不妨在Python下计算&#xff0c;则有&am…

10 - UDP实验

在本章节中&#xff0c;我们将采用 network 与 socket 这两个第三方库来构建UDP网络连接的功能。具体而言&#xff0c;network 库将被应用于WiFi连接的建立&#xff0c;而 socket 库则基于 lwIP 协议栈来实现网络协议的连接。在实验环节&#xff0c;我们将利用 ESP32 开发板与远…

【自动驾驶】决策规划算法(一)决策规划仿真平台搭建 | Matlab + Prescan + Carsim 联合仿真基本操作

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

FL Studio 24.1.1.4285中文完整版新功能介绍及百度网盘下载

‌FL Studio 24‌版本引入了多项新功能和改进&#xff0c;旨在提升用户体验和工作效率&#xff0c;同时保持其强大的功能和灵活性。以下是一些主要的新功能&#xff1a; ‌CLAP插件支持‌&#xff1a;FL Studio 24支持Clever Audio Plug-in (CLAP)插件&#xff0c;这扩展了软件…

认知小文3《打破桎梏,编程与人生的基本法则》

内容摘要&#xff1a; 面对挑战&#xff0c;编程起步艰难但必经磨砺。每周深耕Python&#xff0c;实战项目巩固技能。财务需努力与实战结合&#xff0c;构建坚实基础。规划先行&#xff0c;先进知识助力专家之路。认知升级阅读与多元资源&#xff0c;拓宽视野。价值积累靠专业证…

25届校招IQCAT思维能力自适应测验智鼎测评指南:题库获取、刷题策略与真题解析!

IQCAT思维能力自适应测验考试内容介绍 IOCAT思维能力自适应测验基于二因素智力理论&#xff0c;通过考察作答者的一般认知能力&#xff0c;预测其学习新知识、新技能以及理解、解决问题时的工作表现。IQCAT使用自适应测验技术&#xff0c;根据作答者的作答情况&#xff0c;从题…

8.Lab Sevent —— Multithreading

首先切换到thread分支 git checkout thread make clean Uthread&#xff1a;switch between threads 为用户级线程系统设计上下文切换机制 xv6中已经放了两个文件&#xff1a; user/uthread.c和user/uthread_switch.S 以及一个规则&#xff1a;运行在Makefile中以构建uthre…

Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法

Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法 Text-to-SQL 任务旨在将自然语言查询转换为结构化查询语言(SQL),从而使非专业用户能够便捷地访问和操作数据库。近期,阿里云的 OpenSearch 引擎凭借其一致性对齐技术,在当前极具影响力的 Text-to-SQL 任务…