【构建并发程序】1-线程池-Executor-ExecutionContext

news/2024/4/25 11:31:24/文章来源:https://blog.csdn.net/qq_33982605/article/details/126669606

Executor和ExecutionContext对象

  • 创建线程的缺点
  • 什么是线程池?
  • 什么是Executor?
    • Executor如何创建的线程池?
    • Scala|Java中如何使用executor?
    • 代码案例
  • ExecutionContext

创建线程的缺点

  • 1-创建线程的代价比为对象赋值、获取监控器锁和更新集合中的某个条目等操作所要花费的代价高的多
  • 2-如果应用程序需要执行大量的小型并发任务,并需要较高的吞吐量,那么我们就负担不起为每个任务,都创建一个新线程的花费。
  • 3-在创建线程时我们需要为该线程的调用栈,分配一块内存区域,并在线程之间进行上下文切换,这样做所花费的时间比以并发方式完成任务所花的时间还要多。

什么是线程池?

  • 在每秒数千个请求的情况下,为每个请求都要创建一个新线程会拖慢系统的运行速度,因此同一个线程应该可以能够让许多个请求反复来进行使用;这些可重用的线程通常被称为线程池。

什么是Executor?

Executor如何创建的线程池?

  • Executor是一个简单的接口,它定义了一个名为execute的方法,该方法接受Runnable对象,并且最终会调用该对象中的run方法。
  • 通常Executor接口会以并发的方式将Runnable对象,处理为调用execute方 法的线程,然后将这些线程实现为 “线程池”;

Scala|Java中如何使用executor?

  • ForkJoinPool是在JDK7中引入的一个Executor接口。通过导入scala.concurrent.forkjoin软件包,Scala程序也能够使用该接口。

代码案例

  • 下面的代码展示了实例化ForkJoinPool接口的方式,
  • 以及对其提交能够通过,异步处理任务的方式
object one_Executor extends App {/*** 下面的代码展示了实例化ForkJoinPool接口的方式,* 以及对其提交能够通过,异步处理任务的方式* */import scala.concurrent._val executor = new forkjoin.ForkJoinPool()executor.execute(new Runnable {override def run(): Unit = println("This task is run asynchronously")})/*** 这里加一个sleep的原因是?* 用以防止ForkJoinPool对象中的 “守护线程” 在调用Runnable对象中的run方法之前被终止。* (默认情况下ForkJoinPool对象创建的线程都是守护线程)* *///  Thread.sleep(500) //有了awaitTermination就不用在用sleep了executor.shutdown() //调用shutdown时,不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常//awaitTermination是一个阻塞方法。它必须等待线程池(ForkJoinPool(Executor))“退出”后才会结束自身。(shutdown放在其后面根本不会运行,因为都已经堵塞了)// 1、因为是守护线程,main线程没退出,守护线程也不会“退出”,所以就在这堵塞了// 2、shutdown放在其前面,awaitTermination等待期间,shutdown也在等待任务的结束。// 等待期间,任务结束了shutdown才会关闭线程并“退出”,awaitTermination发现shutdown退出,则表示任务结束,此时会返回true。// 等待期间,awaitTermination发现shutdown没有退出,则表示任务没结束,此时会返回false。val b: Boolean = executor.awaitTermination(2, TimeUnit.SECONDS)println(b) //true
}

ExecutionContext

  • 创建ExecutionContext线程池的2种办法:
  • 1-通过全局对象创建(默认时8个线程)
    • object ceshi extends App{val a = ExecutionContext.globala.execute(new Runnable{def run()=log.info("创建")})Thread.sleep(500)
      }
      
  • 2-通过ForkJoinPool创建(这里创建了2个线程)
    •  object ceshi extends App{val pool = new forkjoin.ForkJoinPool(2)val a = ExecutionContext.fromExecutorService(pool)a.execute(new Runnable{def run()=log.info("创建")})Thread.sleep(500)}
      

注意:
 ExecutionContext类的伴生对象,定义了2个方法:

  •  fromExecutor:里面没有shutdown
  •  fromExecutorService:扩展了fromExecutor,里面旧有shutdown

(本文章虽然采用的代码为scala代码,但java代码与Scala代码可以互相转换,且本质上两者所阐述的东西都是一致的)

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

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

相关文章

深度估计 双目深度估计+单目深度估计 ONNX运行程序

双目深度估计ONNX Practical Stereo Matching via Cascaded Recurrent Network with Adaptive Correlation https://github.com/ibaiGorordo/ONNX-CREStereo-Depth-Estimation 双目深度估计需要从dataset读取左右两个view的图片。 使用模型进行深度图的估计 model_path …

2022年0902Maven的依赖学习<第四课>

本博客学习的目标图目录 第一部分 Maven的依赖的学习内容介绍 第一点 依赖的范围 1 依赖范围 Scope 2 一张表告诉你Scope的范围介绍 3 总结: 4 观察 5 测试 ①验证 compile 范围对 main 目录有效 ②验证test范围对main目录无效 ③验证test和provided范围不参与服务器…

这份 Github 下载量高达 76.9W 次的《Java 系列面试宝典》,足以吊打各个大厂面试官

前言: 之前有看过很多的 Java 知识点资料,但是很多资料都是零零散散的并且不全面,像这样一整份 PDF 文档,分知识点整理好的资料并不多了,所以我觉得我是捡到宝了,所以特意分享给大家,需要的人可以自取&…

基数排序(学习)

一、基数排序描述 基数排序(radix sort)属于分配式排序,又被称为桶子法,它是通过键值的各个位的值,将要排序的元素分配至某些桶中,达到排序的作用基数排序法属于稳定的排序,基数排序法的是效率高的稳定性排序法基数排序是桶排序的扩展 二、基数排序描述 将所有待比较数值统一为…

Vulnhub靶场 ICA: 1

环境准备 靶机地址:ICA: 1 ~ VulnHub 漏洞复现 arp-scan -l IP信息收集 nmap进行IP服务扫描,发现开放80,22,3306端口 访问80端口,可以看到是qdPM 9.2的框架 kali进行漏洞搜索,发现存在 查看该文件的目录…

电子学会2022年6月青少年软件编程(图形化)等级考试试卷(一级)

青少年软件编程青少年软件编程(图形化)一级 一、单选题(共25题,共50分) 广场中有声控喷泉,当声音的音量大于60的时候,喷泉就会喷出水,现在的音量为30,下列哪个选项可以让喷泉喷出水?…

【Vue 基础知识】keep-alive是什么?怎么用?

提示:前端查漏补缺,仅代表个人观点,不接受任何批评 文章目录一、keep-alive是什么?二、使用步骤1. 基本使用2. 允许组件有条件地缓存3. 缓存组件实例数量限制三、注意事项提示:以下是本篇文章正文内容,下面…

【编程题】【Scratch四级】2021.06 从小到大排序

从小到大排序 小猴子询问输入5个数,存入列表后,将这些数字从小到大排列后重新存入列表。 1. 准备工作 (1)保留舞台默认白色背景; (2)删除小猫角色,添加Monkey角色。 2. 功能实现…

新库上线 | CnOpenData房地产业工商注册企业基本信息数据

房地产业工商注册企业基本信息数据 一、数据简介 房地产业是指:以土地和建筑物为经营对象,从事房地产开发、建设、经营、管理以及维修、装饰和服务的集多种经济活动为一体的综合性产业,是具有先导性、基础性、带动性和风险性的产业。 房地产…

SpringBoot_11_整合MyBatis

SpringBoot_11_整合MyBatis整合MyBatis整合测试整合MyBatis 官方文档:http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/ Maven仓库地址:https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-…

Vue——整理一些开源管理平台项目

【VUE2】 vue-element-admin Git代码仓库:https://github.com/PanJiaChen/vue-element-admin.git Gitee代码仓库:https://gitee.com/wry-vue-demo/vue-element-admin-wry (不定期同步) 官方文档:https://panjiachen.g…

优雅的实现EasyPoi动态导出列的两种方式

文章目录前言一、基于Excel的 isColumnHidden 属性1.1 实现原理1.2 实现步骤1.3 实现效果二. 基于List< ExcelExportEntity > 的导出2.1 实现效果总结前言 嗨&#xff0c;大家好&#xff0c;我是希留。 项目里使用的是EasyPoi来处理导入导出功能的。近日因业务需求调整…

基于springboot+vue的游戏交流论坛系统 elementui

随着时代的发展&#xff0c;人们对手机和电脑的依赖越来越严重。很多时候人们会在下班之后或者下课之后和寝室以及朋友们来一盘游戏。以度过这些空闲时间。但是对于更多的人来说&#xff0c;他们可能是在孤军奋战&#xff0c;并没有更多的朋友和同学去进行交流&#xff0c;这个…

【目标检测算法】YOLO-V1~V3原理梳理

文章目录one-stage 与 tow-stage评价指标YOLO算法整体思路解读YOLO-V1YOLO-V2YOLO-V3one-stage 与 tow-stage 本篇博客主要介绍经典检测方法中的one-stage&#xff08;单阶段&#xff09;&#xff0c;在这里给自己埋个坑&#xff0c;整理完Yolo再去搞tow-stage。 one-stage:tow…

x64dbg 插件开发环境配置

x64dbg 是一款开源的应用层反汇编调试器,旨在对没有源代码的可执行文件进行恶意软件分析和逆向工程,同时 x64dbg 还允许用户开发插件来扩展功能,插件开发环境的配置非常简单,如下将简单介绍x64dbg是如何配置开发环境以及如何开发插件的。x64dbg 是一款开源的应用层反汇编调…

计算机网络——传输层の选择题整理

传输层提供的服务 1、可靠传输协议中&#xff0c;可靠指的是&#xff08;&#xff09; A、使用面向连接的会话 B、使用尽力而为的传输 C、使用滑动窗口来维持可靠性 D、使用确认机制来确保传输的数据不丢失 解析&#xff1a;选D 对于A&#xff0c;使用面向连接的会话&#xff…

hadoop学习使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、hadoop的作用&#xff1f; hadoop是什么&#xff1f;hadoop能做什么&#xff1f;搭建HadoopHA高可用集群 1普通集群配置文件2 高可用集群配置 整理和记录搭建…

Hadoop伪分布式搭建

搭建环境&#xff1a; centos6.5 vm16 jdk1.8 hadoop 2.6.5 1.先设置静态ip vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICEeth0 #HWADDR00:0C:29:42:15:C2 TYPEEthernet ONBOOTyes NM_CONTROLLEDyes BOOTPROTOstatic IPADDR192.168.90.11 NETMASK255.255.255.0 GA…

单分散亚微米聚苯乙烯—聚乙酸乙烯酯(P(St-VAc))聚合物微球/聚苯乙烯塑料微球聚乙烯醇相关知识

单分散亚微米聚苯乙烯—聚乙酸乙烯酯(P(St-VAc))聚合物微球相关研究&#xff1a; 互贯聚合物网络( the interpenetrating polymernetworks,简称IPNs)是由两种或两种以上的交联聚合物互相贯穿而形成的一种聚合物合金体系["。由于形成IPNs时两网之间的互贯和缠结&#xff0…

阿里巴巴按关键字搜索商品 API 返回值说明

请求参数 请求参数&#xff1a;q眼镜&start_price0&end_price0&page1&cat0&discount_only&sort&page_size40&seller_infono&nick&seller_info&nick&ppath&imgid&filter 参数说明&#xff1a;q:搜索关键字 cat:分类I…