线程并发库和线程池的作用_并发–顺序线程和原始线程

线程并发库和线程池的作用

不久前,我参与了一个项目,该项目的报告流程如下:
  1. 用户会要求举报
  2. 报告要求将被翻译成较小的部分
  3. 基于零件/节的类型的每个零件的报告将由报告生成器生成
  4. 组成报告的各个部分将重新组合成最终报告,并返回给用户

我的目标是展示如何从错误的实现过渡到相当好的实现:
单元测试最好地展示了我拥有的一些基本构建基块:这是一个测试助手,它生成示例报告请求,其中包括组成报告请求部分:

public class FixtureGenerator {public static ReportRequest generateReportRequest(){List<ReportRequestPart> requestParts = new ArrayList<ReportRequestPart>();Map<String, String> attributes = new HashMap<String, String>();attributes.put("user","user");Context context = new Context(attributes );ReportRequestPart part1 = new ReportRequestPart(Section.HEADER, context);ReportRequestPart part2 = new ReportRequestPart(Section.SECTION1, context);ReportRequestPart part3 = new ReportRequestPart(Section.SECTION2, context);ReportRequestPart part4 = new ReportRequestPart(Section.SECTION3, context);ReportRequestPart part5 = new ReportRequestPart(Section.FOOTER, context);   requestParts.add(part1);        requestParts.add(part2);requestParts.add(part3);requestParts.add(part4);requestParts.add(part5);ReportRequest reportRequest  = new ReportRequest(requestParts );return reportRequest;}}

以及生成报告的测试:

public class FixtureGenerator {@Testpublic void testSequentialReportGeneratorTime(){long startTime = System.currentTimeMillis();Report report = this.reportGenerator.generateReport(FixtureGenerator.generateReportRequest());long timeForReport = System.currentTimeMillis()-startTime;assertThat(report.getSectionReports().size(), is (5));logger.error(String.format("Sequential Report Generator : %s ms", timeForReport));}

生成报告一部分的组件是一个虚拟实现,具有2秒的延迟以模拟IO密集调用:

public class DummyReportPartGenerator implements ReportPartGenerator{@Overridepublic ReportPart generateReportPart(ReportRequestPart reportRequestPart) {try {//Deliberately introduce a delayThread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return new ReportPart(reportRequestPart.getSection(), "Report for " + reportRequestPart.getSection());}
}

顺序执行
 
给定这些基本的类集,我的第一个天真的顺序实现如下:

public class SequentialReportGenerator implements ReportGenerator {private ReportPartGenerator reportPartGenerator;@Overridepublic Report generateReport(ReportRequest reportRequest){List<ReportRequestPart> reportRequestParts = reportRequest.getRequestParts();List<ReportPart> reportSections = new ArrayList<ReportPart>();for (ReportRequestPart reportRequestPart: reportRequestParts){reportSections.add(reportPartGenerator.generateReportPart(reportRequestPart));}return new Report(reportSections);}......
}

显然,对于其中包含5个部分的报告请求,每个部分需要2秒钟才能完成,此报告大约需要10秒钟才能返回给用户。

它请求同时进行。

基于原始线程的实现
 
以下是第一个并发实现,虽然不好,但比顺序的要好,其中为每个报告请求部分都生成了一个线程,等待要生成的报告部分(使用thread.join()方法),并在出现这些块时对其进行汇总在。

public class RawThreadBasedReportGenerator implements ReportGenerator {private static final Logger logger = LoggerFactory.getLogger(RawThreadBasedReportGenerator.class);private ReportPartGenerator reportPartGenerator;@Overridepublic Report generateReport(ReportRequest reportRequest) {List<ReportRequestPart> reportRequestParts = reportRequest.getRequestParts();List<Thread> threads = new ArrayList<Thread>();List<ReportPartRequestRunnable> runnablesList = new ArrayList<ReportPartRequestRunnable>();for (ReportRequestPart reportRequestPart : reportRequestParts) {ReportPartRequestRunnable reportPartRequestRunnable = new ReportPartRequestRunnable(reportRequestPart, reportPartGenerator);runnablesList.add(reportPartRequestRunnable);Thread thread = new Thread(reportPartRequestRunnable);threads.add(thread);thread.start();}for (Thread thread : threads) {try {thread.join();} catch (InterruptedException e) {logger.error(e.getMessage(), e);}}List<ReportPart> reportParts = new ArrayList<ReportPart>();for (ReportPartRequestRunnable reportPartRequestRunnable : runnablesList) {reportParts.add(reportPartRequestRunnable.getReportPart());}return new Report(reportParts);}    .....
}

这种方法的危险在于,将为每个报表部件创建一个新线程,因此在实际情况下,如果同时发出100个请求,并且每个请求产生5个线程,则可能最终在vm中创建500个代价高昂的线程!!

因此,必须以某种方式限制线程的创建。 在下一篇博客文章中,我将介绍另外两种控制线程的方法。

参考: 并发–来自JCG合作伙伴 Biju Kunjummen的all和杂物博客。


翻译自: https://www.javacodegeeks.com/2012/07/concurrency-sequential-and-raw-thread.html

线程并发库和线程池的作用

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

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

相关文章

ipad2018编写html,IT教程:ipad6是ipad2018吗

科技就如同电灯发出的光一样&#xff0c;点亮我们的世界&#xff0c;点亮我们的生活&#xff0c;这一段时间以来ipad6是ipad2018吗的消息络绎不绝是什么原因呢?接下来就让我们一起了解一下吧。大家好&#xff0c;我是智能客服时间君&#xff0c;上述问题将由我为大家进行解答。…

Web工程师修行笔记_必备单词(第三部)

历经千辛万苦&#xff0c;整理了软件开发过程中必备英文单词&#xff0c;助你走向编程巅峰 !!! 连最难的英文单词你都征服了&#xff0c;你还怕什么&#xff1f; (拒绝死记硬背&#xff0c;平时多看看&#xff0c;多用于代码中&#xff0c;&#xff09; 【不求全部都会&#xf…

流的多层次分组

1.简介 使用Java 8流&#xff0c;可以很容易地根据不同的标准对对象集合进行分组。 在这篇文章中&#xff0c;我们将看到如何从简单的单级分组到更复杂的&#xff0c;涉及多个级分组的分组。 我们将使用两个类来表示我们要分组的对象&#xff1a;人和宠物。 人类 public cla…

华为微型计算机b515,华为MateStation B515台式机曝光:五种配置

之前华为官网曾上架了台式机MateStation B515&#xff0c;这引起了很多网友的关注&#xff0c;不过实际情况是&#xff0c;它只是针对政企渠道&#xff0c;不过官方当时并没有给出新品的售价。从网友最新曝光的细节看&#xff0c;MateStation B515要比之前传闻的价格便宜不少&a…

冈仁波齐

昨日看了《冈仁波齐》&#xff0c;其实第一次听这部电影还是在网易云看到朴树的新歌《No Fear In My Heart》时知道有这样一部电影的&#xff1b; 抱着好奇心去看&#xff0c;发现这确实是一部不错的电影&#xff0c;具体好在哪里我也不是说得很清楚&#xff0c;只知道我在看电…

计算机图形相关输出设备,计算机图形输出设备.ppt

计算机图形输出设备第2章 计算机图形系统 2.1 计算机图形系统概述 2.2 基于Windows的图形程序开发方法 2.3 OpenGL介绍 2.1 计算机图形系统概述 2.1.1 计算机图形外部设备 新型显示器 计算机图形输入设备 计算机图形输出设备 2.1.2 计算机图形软件 几何造型平台 CAD/CAM 计算机…

Linux下用ls和du命令查看文件以及文件夹大小

ls的用法 ls -l |grep "^-"|wc -l或find ./company -type f | wc -l 查看某文件夹下文件的个数&#xff0c;包括子文件夹里的。 ls -lR|grep "^-"|wc -l 查看某文件夹下文件夹的个数&#xff0c;包括子文件夹里的。 ls -lR|grep "^d"|wc -l …

四川高职计算机二本线学校,全网首发!四川省本科二批次2019年对口高职投档录取线出炉...

原标题&#xff1a;全网首发&#xff01;四川省本科二批次2019年对口高职投档录取线出炉四川省2019年高校招生本科录取接近尾声&#xff0c;二本批次征集志愿于8月1日进行。与此同时&#xff0c;专科批相关录取工作也进入我们视野。四川省各高校2019年对口高职调档线我省高职院…

app engine_App Engine中的Google Services身份验证,第1部分

app engine这篇文章将说明如何构建一个简单的Google App Engine&#xff08;GAE&#xff09;Java应用程序&#xff0c;该应用程序可以针对Google进行身份验证&#xff0c;并利用Google的OAuth授权访问Google的API服务&#xff08;例如Google Docs&#xff09;。 此外&#xff0…

Angular最新教程-第六节编写响应式导航栏

这节课我们讲解如何使用bootstrap 4 编写响应式布局。 参考图我们还是参照Angular中文社区http://www.angularjs.cn/ 图中标注红色的部分&#xff0c;我自己不是很喜欢&#xff0c;所以做了一点小改动。 他这里也没有做响应式布局&#xff0c;所以样式就不抄他的&#xff0c…

使用Spring-Retry重试处理

只要软件组件相互通信&#xff0c;就有可能出现临时的自我纠正错误。 此类故障包括服务的暂时不可用&#xff0c;网络连接的暂时丢失或服务繁忙时出现的超时。 在这种情况下&#xff0c;适当的重试处理可以减少这些故障可能引起的问题。 在这篇文章中&#xff0c;我们将看到如…

计算机在智慧交通的应用论文,智能交通的毕业论文

智能交通的毕业论文智能运输系统的研究许多国家都投入了巨大的人力和物力,并成为继航空航天、军事领域之后高新技术应用最集中的领域。下面为大家分享了有关智能交通的论文&#xff0c;欢迎欣赏&#xff01;摘 要&#xff1a;八十年代以来&#xff0c;世界一些发达国家纷纷投入…

MySQL5.5安装教程

1、 官网下载mysql5.5 下载地址&#xff1a; http://dev.mysql.com/downloads/mysql/5.5.html#downloads 2、 安装mysql5.5 注意&#xff0c;安装之前&#xff0c;请关闭杀毒软件。 &#xff08;1&#xff09; 打开下载的mysql-5.5.53-winx64.msi &#xff08;2&#xff09; 点…

计算机软件硬件基础知识,计算机硬件基础_计算机软硬件基础知识都包括什么具体的内容...

计算机硬件基础怎么学过去有许多微型计算机原理的书&#xff0c;讲或的原理现在肯定还有这方面的书&#xff0c;但讲的是什么我就不知道了还有学学单片机也可以对计算机硬件原理有所了解还可看有关杂志&#xff0c;如《微型计算机》&#xff0c;刚开始可能许多文章都看不懂&…

php里的抽象类和接口

//实例化类产生对象。//class fenbi//{// //普通成员&#xff0c;属于对象// public $length "10cm";// //静态成员&#xff0c;静态变量&#xff0c;属于类。// public static $color;//// //普通方法可以调用静态成员// function hua(){// echo $this->l…

新疆计算机二级慨库,2020新疆维吾尔自治区计算机二级易考套餐:二级MS Office高级应用全程班(网课+题库+教材)...

&nbsp&nbsp[导读]:2020新疆维吾尔自治区计算机二级易考套餐&#xff1a;二级MS Office高级应用全程班(网课题库教材)&#xff0c;更多新疆等级考试易考套餐&#xff0c;请访问易考吧新疆等级考试栏目2020新疆维吾尔自治区计算机二级易考套餐&#xff1a;二级MS Office高…

hotspot jvm_在Hotspot JVM中跟踪过多的垃圾收集

hotspot jvm由于内存泄漏或其他内存问题&#xff0c;经常导致应用程序冻结&#xff0c;仅使垃圾收集器&#xff08;GC&#xff09;进程运行失败&#xff0c;试图释放一些空间。 直到看门狗&#xff08;或沮丧的管理员&#xff09;重新启动应用程序并且问题从未解决之前&#xf…

计算机上平方米的单位,word怎么写平方米 word中平方米的单位怎么打

1、以Word2010版本为例&#xff0c;在文档中输入了平方米的单位&#xff0c;但是数字2不在上方&#xff1b;2、首先选中数字2&#xff0c;然后点击页面上方的上标图标&#xff0c;如下图所示&#xff1b;3、点击上标图标后&#xff0c;就会发现数字2在字母的右上方了&#xff0…

Xamarin 2017.10.9更新

Xamarin 2017.10.9更新本次更新主要解决了一些bug。Visual Studio 2017升级到15.4获得新功能。Visual Studio 2015需要工具-选项-Xamarin进行更新&#xff0c;更新Xamarin插件到4.7.10.22 版本。工具包分享链接&#xff1a;http://pan.baidu.com/s/1dE5hnCP 密码&#xff1a;3k…

通过入侵JVM打印阵列

总览 Java中最常见的陷阱之一就是知道如何打印数组。 如果有关如何打印阵列的答案获得了超过1000票赞成票&#xff0c;那么您必须怀疑是否有更简单的方法。 几乎所有其他流行语言都具有这种更简单的方法&#xff0c;因此我不清楚Java为什么仍会这样做。 与其他JDK类不同&#…