java 线程池实现方式

在这里插入图片描述

线程和数据库连接这些资源都是非常宝贵的资源。那么每次需要的时候创建,不需要的时候销 毁,是非常浪费资源的。那么我们就可以使用缓存的策略,也就是使用线程池。

newCachedThreadPool

创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行
很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造
的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并
从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源

newFixedThreadPool

创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大
多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,
则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何
线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之
前,池中的线程将一直存在。
newScheduledThreadPool
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。

ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3); scheduledThreadPool.schedule(newRunnable(){
@Override
public void run() {
System.out.println("延迟三秒");
}
}, 3, TimeUnit.SECONDS);
scheduledThreadPool.scheduleAtFixedRate(newRunnable(){ @Override
public void run() {
System.out.println("延迟 1 秒后每三秒执行一次");
}
},1,3,TimeUnit.SECONDS);

newSingleThreadExecutor

Executors.newSingleThreadExecutor()返回一个线程池(这个线程池只有一个线程),这个线程池可以在线程死后(或发生异常时)重新启动一个线程来替代原来的线程继续执行下去。

线程池底层ThreadPoolExecutor

执行器 Executor 是顶级接口,只包含了一个 execute 方法,用来执行一个 Runnable 任务。

执行器服务 ExecutorService 接口继承了 Executor 接口,ExecutorService 是所有线程池的基础接口,它定义了所有线程接口:

线程池执行器 ThreadPoolExecutor 是基础线程池的核心实现,并且可以通过制 ThreadPoolExecutor 的构造参数或者继承 ThreadPoolExecutor,实现自己的线程池。

ScheduledThreadPoolExecutor 继承自 ThreadPoolExecutor,是能执行周期性任务或定时任务的线程池;
● ForkJoinPool 是 JDK1.7 时添加的类,作为对 Fork/Join 型线程池的实现。

excute

从 Executor 接口继承到的 execute 方法.使用该方法即将一个 Runnable 任务交给线程池去执行。

submit 方法

submit 方法会提交一个任务去给线程池执行,该任务可以是带返回结果的 Callable 任务,也可以是一开始就指定结果的 Runnable 任务,或者不带结果的 Runnable 任务(此时即一开始指定结果为 null)。submit 方法会返回一个与所提交任务相关联的 Future。
● 向线程池提交一个 Runnable 或者 Callable 任务。
● 将 任务 作为参数使用 newTaskFor 方法构造出 FutureTask;
FutureTask 实现了 Runnable 和 Future 两个接口,从而 FutureTask 可以作为 Runnable 交给 Worker(Thread)去运行,也可以作为一个 Future 与任务交互)。

1.线程池使用 execute 方法将 FutureTask 交给当前的 Worker 去运行,并将 FutureTask 以 Future 返回;

然后 Worker 执行任务(即运行 run 方法),在任务完成后,为 Future(FutureTask) 设置结果 —— 设置结果之前,调用 Future 的 get 方法会让调用线程处于阻塞状态:

通过 Future 的 get 方法,获得任务的结果。

invokeAll 方法

invokeAll 方法可以一次执行多个任务,但它并不同等于多次调用 submit 方法。submit 方法是非阻塞的,每次调用 submit 方法提交任务到线程池之后,会立即返回与任务相关联的 Future,然后当前线程继续向后执行。

而 invokeAll 方法是阻塞的,只有当提交的多个任务都执行完毕之后,invokeAll 方法才会返回,执行结果会以List<Future> 返回,该 List<Future> 中的每个 Future 是和提交任务时的 Collection<Callable> 中的任务 Callable 一 一对应的。带 timeout 参数的 invokeAll 就是设置一个超时时间,如果超过这个时间 invokeAll 中提交的所有任务还有没全部执行完,那么没有执行完的任务会被取消(中断),之后同样以一个 List<Future> 返回执行的结果。
invokeAny 方法也是阻塞的,与 invokeAll 方法的不同之处在于,当所提交的一组任务中的任何一个任务完成之后,invokeAny 方法便会返回(返回的结果便是那个已经完成的任务的返回值),而其他任务会被取消(中断)。

awaitTermination

awaitTermination 可以用来判断线程池是否已经关闭。调用 awaitTermination 之后,在 timeout 时间内,如果线程池没有关闭,则阻塞当前线程,否则返回 true;当超过 timeout 的时间后,若线程池已经关闭则返回 true,否则返回 false。该方法一般这样使用:
● 任务全部提交完毕之后,我们调用 shutdown 方法向线程池发送关闭的指令;
● 然后我们通过 awaitTermination 来检测到线程池是否已经关闭,可以得知线程池中所有的任务是否已经执行完毕;
● 线程池执行完已经提交的所有任务,并将自己关闭;
● 调用 awaitTermination 方法的线程停止阻塞,并返回 true;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机的有害气体检查系统设计

**单片机设计介绍&#xff0c;基于单片机的有害气体检查系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的有害气体检查系统设计旨在实现对环境中各种有害气体的实时监测与报警&#xff0c;保障人员健康和环境…

什么是原生IP?原生IP的作用是什么?

原生IP&#xff08;Native IP&#xff09;是指直接从互联网服务提供商&#xff08;ISP&#xff09;获得的IP地址&#xff0c;而非通过代理服务器、VPN或其他中间层方式获取。这种IP地址直接与用户的设备或网络关联&#xff0c;无需经过任何中间服务器或代理的转发或隐藏&#x…

物联网实战--驱动篇之(一)EEPROM存储器(AT24C64)

目录 一、驱动概述 二、AT24C64简介 三、驱动编写 四、驱动应用 一、驱动概述 这是驱动篇的第一篇&#xff0c;所以先说明下驱动篇的作用和书写计划。之前的净化器项目已有提及&#xff0c;向ESP8266、SHT30这些都属于驱动设备&#xff0c;主芯片STM32是核心&#xff0c;相…

C++入门4.引用

目录 1.引用概念&#xff1a; 2.引用特性&#xff1a; 3.常引用&#xff1a; 4.使用场景&#xff1a; 引用和指针的区别&#xff1a; 1.引用概念&#xff1a; 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空…

BLE协议—HID

BLE协议—HID HID设备HOGP&#xff08;HID Over GATT Profile&#xff09;HID服务HID infoHID ModeHID ReportHID MAP HID设备 HID&#xff08;Human Interface Device&#xff0c;人机接口设备&#xff09;是USB设备中常用的设备类型&#xff0c;是直接与人交互的USB设备&…

谷歌AI搜寻背后的资本战:收费传言引爆行业震荡|TodayAI

考虑对其AI驱动的搜索工具收费&#xff0c;这一消息在某种程度上让人感到惊讶。毕竟&#xff0c;谷歌超过一半的总收入来自搜索业务&#xff0c;几乎是其次大收入来源的五倍。YouTube订阅、Pixel手机、Play商店佣金以及Gmail存储空间的收入加起来&#xff0c;与搜索业务的价值相…

机台数据传输共享存在哪些问题?机台数据管控怎么做?

一些金融机构、大型制造业以及晶圆制造厂里面&#xff0c;都会存在大量的机台设备&#xff0c;这些机台会产⽣庞⼤⽽属性不同的数据&#xff0c;这些数据需要定期的进行采集和利用。机台数据在传输分享过程中&#xff0c;会面临各种问题和调整&#xff0c;所以需要做好机台数据…

Java 线程池的基本用法

线程池 池化思想&#xff1a;线程池、数据连接池等&#xff0c;比如我们 Spark 的 Executor 就是典型的线程池&#xff0c;用户在启动 Spark 作业的同时启动线程池&#xff0c;这样 Spark 的 Task 就可以直接获取资源&#xff0c;而不用像 MR 程序那样等待容器上的进程开启了。…

一、持续集成介绍

持续集成介绍 一、什么是持续集成二、持续集成的流程三、持续集成的组成要素四、持续集成的好处 一、什么是持续集成 持续集成&#xff08;CI&#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干。持续集成的目的&#xff0c;就是让产品可…

JavaScript前端学习大全

一、概念 JavaScript简称为JS&#xff0c;这门语言诞生主要用于完成页面的数据验证&#xff0c;因此运行在客户端&#xff0c;需要浏览器来解析JavaScript的代码。是世界上最流行的脚本语言。JavaScript 是一种让网页变得有趣和动态的编程语言。比如&#xff0c;当你在网页上点…

学习【RabbitMQ入门】这一篇就够了

目录 1. RabbitMQ入门1-1. 同步调用1-2. 异步调用1-3. MQ技术选型1-4. RabbitMQ介绍消息模式 1-5. SpringAMQPBasic QueueWork QueueFanout ExchangeDirect ExchangeTopic Exchange消息转换器 1. RabbitMQ入门 1-1. 同步调用 优势&#xff1a; 时效性强&#xff0c;等待到结…

当前2024阿里云服务器哪个地域价格比较优惠,哪个地域便宜?

目前2024年阿里云服务器地域对比哪个价格更优惠&#xff1f;华北6&#xff08;乌兰察布&#xff09;、华北3&#xff08;张家口&#xff09;、华北1&#xff08;青岛&#xff09;和华南2&#xff08;河源&#xff09;地域更便宜&#xff0c;云服务器吧yunfuwuqiba.com整理阿里云…

【量子计算机为什么能吊打通用计算机】浅谈

Quntum Computer 一、量子计算机导入 这是一双手&#xff0c;这是大自然送给你最神奇的礼物&#xff0c;你用它来写字、吃饭、打游戏&#xff0c;除此之外&#xff0c;它还有一个妙不可言的功能&#xff0c;计算。是的&#xff0c;手是你人生中的第一个计算器&#xff0c;到小…

Azure service tag 导致的Exchange online 无法发送邮件的问题

最近碰到一个比较有趣的客户问题。 这个客户一直在使用Exchange online 与自己在Azure Vnet 里面的exchange server交换邮件。 客户的网络架构如下图所示。 客户说之前从exchange online往外发邮件一直是好的,但是最近两周开始只有百分之3左右的邮件可以发出去,其他的都pen…

java中大型医院HIS系统源码 Angular+Nginx+SpringBoot云HIS运维平台源码

java中大型医院HIS系统源码 AngularNginxSpringBoot云HIS运维平台源码 云HIS系统是一款满足基层医院各类业务需要的健康云产品。该产品能帮助基层医院完成日常各类业务&#xff0c;提供病患预约挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生工作站和护士工…

不连续页分配器

不连续页分配器 在设备长时间运行后&#xff0c;内存碎片话&#xff0c;连续的物理页比较稀缺&#xff1b;伙伴分配器和slab块分配器&#xff0c;分配的内存物理上是连续的&#xff1b;在这种情况下&#xff0c;如果需要分配长度超过一页的内存块&#xff0c;可以使用不连续页…

LeetCode-17. 电话号码的字母组合【哈希表 字符串 回溯】

LeetCode-17. 电话号码的字母组合【哈希表 字符串 回溯】 题目描述&#xff1a;解题思路一&#xff1a;回溯三部曲&#xff1a;解题思路二&#xff1a;回溯解题思路三&#xff1a; 题目描述&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组…

【JavaSE】反射

Java代码的生命周期 Java代码在计算机中经历的阶段&#xff1a;Source源代码阶段、Class类对象阶段、RunTime运行时阶段。 Source源代码阶段: 这个阶段是由程序员编写生成源代码,再由Javac编译器生成class文件。 Class类对象阶段&#xff1a;由类加载器将class文件加载到JVM内…

【保姆级教程】如何订阅OnlyFans?如何在OnlyFans上面支付?OnlyFans虚拟卡订阅教程

1. 引言 什么是OnlyFans&#xff1a;OnlyFans是一种内容订阅服务&#xff0c;成立于2016年&#xff0c;允许内容创作者从用户那里获得资金&#xff0c;用户需要支付订阅费用才能查看他们的内容。它在多个领域受到欢迎&#xff0c;包括音乐、健身、摄影&#xff0c;以及成人内容…

C语言之指针(4)使用并模拟实现qsort

冒泡排序有局限性&#xff0c;实现时间长而且只能进行整型数据的排序&#xff0c;接下来介绍模拟实现qsort来方便实现各种数据的排序。 函数基本形式&#xff1a; 可以看到该函数有四个参数&#xff0c;第四个参数是一个函数指针&#xff0c;这个指针指向的函数第一个参数和第…