lambda 高并发_玩Java 8 – Lambda和并发

lambda 高并发

因此Java 8不久前发布,具有大量功能和更改。 我们所有的Java狂热者一直在等待这一点,从他们最初宣布Java 7的所有强大功能开始一直到最终被取消。

我最近才有时间实际开始给它一个真实的外观,我将我的家庭项目更新为8个,我不得不说,我对所获得的一切通常感到非常满意。 java.time API的“模仿” JodaTime是一个很大的改进,java.util.stream软件包正在变得有用,lambda将改变我们的编码样式,这可能需要一些时间来适应这些变化……引用“强大的力量伴随着巨大的责任”这句话是正确的,我认为未来可能会有一些有趣的时刻,因为编写一些难以破解的代码非常容易。 作为调试我下面编写的代码的示例,它会很有趣。

该文件示例在我的Github博客仓库中

此示例的操作很简单,运行几个线程,并发执行一些工作,然后等待它们全部完成。 我在玩Java 8的时候就想通了,让我全力以赴……
这是我想出的:

package net.briandupreez.blog.java8.futures;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import java.util.Collection;
import java.util.List;
import java.util.concurrent.*;
import java.util.stream.Collectors;/*** Generified future running and completion** @param <T> the result type* @param <S> the task input*/
public class WaitingFuturesRunner<T, S> {private transient static final Log logger = LogFactory.getLog(WaitingFuturesRunner.class);private final Collection<Task<T, S>> tasks;private final long timeOut;private final TimeUnit timeUnit;private final ExecutorService executor;/*** Constructor, used to initialise with the required tasks** @param tasks the list of tasks to execute* @param timeOut  max length of time to wait* @param timeUnit     time out timeUnit*/public WaitingFuturesRunner(final Collection<Task<T, S>> tasks, final long timeOut, final TimeUnit timeUnit) {this.tasks = tasks;this.timeOut = timeOut;this.timeUnit = timeUnit;this.executor = Executors.newFixedThreadPool(tasks.size());}/*** Go!** @param taskInput          The input to the task* @param consolidatedResult a container of all the completed results*/public void go(final S taskInput, final ConsolidatedResult<T> consolidatedResult) {final CountDownLatch latch = new CountDownLatch(tasks.size());final List<CompletableFuture<T>> theFutures = tasks.stream().map(aSearch -> CompletableFuture.supplyAsync(() -> processTask(aSearch, taskInput, latch), executor)).collect(Collectors.<CompletableFuture<T>>toList());final CompletableFuture<List<T>> allDone = collectTasks(theFutures);try {latch.await(timeOut, timeUnit);logger.debug("complete... adding results");allDone.get().forEach(consolidatedResult::addResult);} catch (final InterruptedException | ExecutionException e) {logger.error("Thread Error", e);throw new RuntimeException("Thread Error, could not complete processing", e);}}private <E> CompletableFuture<List<E>> collectTasks(final List<CompletableFuture<E>> futures) {final CompletableFuture<Void> allDoneFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));return allDoneFuture.thenApply(v -> futures.stream().map(CompletableFuture<E>::join).collect(Collectors.<E>toList()));}private T processTask(final Task<T, S> task, final S searchTerm, final CountDownLatch latch) {logger.debug("Starting: " + task);T searchResults = null;try {searchResults = task.process(searchTerm, latch);} catch (final Exception e) {e.printStackTrace();}return searchResults;}}

测试:

package net.briandupreez.blog.java8.futures;import net.briandupreez.blog.java8.futures.example.StringInputTask;
import net.briandupreez.blog.java8.futures.example.StringResults;
import org.apache.log4j.BasicConfigurator;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;/*** Test* Created by brian on 4/26/14.*/
public class CompletableFuturesRunnerTest {@BeforeClasspublic static void init() {BasicConfigurator.configure();}/***  5tasks at 3000ms concurrently should not be more than 3100* @throws Exception error*/@Test(timeout = 3100)public void testGo() throws Exception {final List<Task<String, String>> taskList = setupTasks();final WaitingFuturesRunner<String, String> completableFuturesRunner = new WaitingFuturesRunner<>(taskList, 4, TimeUnit.SECONDS);final StringResults consolidatedResults = new StringResults();completableFuturesRunner.go("Something To Process", consolidatedResults);Assert.assertEquals(5, consolidatedResults.getResults().size());for (final String s : consolidatedResults.getResults()) {Assert.assertTrue(s.contains("complete"));Assert.assertTrue(s.contains("Something To Process"));}}private List<Task<String, String>> setupTasks() {final List<Task<String, String>> taskList = new ArrayList<>();final StringInputTask stringInputTask = new StringInputTask("Task 1");final StringInputTask stringInputTask2 = new StringInputTask("Task 2");final StringInputTask stringInputTask3 = new StringInputTask("Task 3");final StringInputTask stringInputTask4 = new StringInputTask("Task 4");final StringInputTask stringInputTask5 = new StringInputTask("Task 5");taskList.add(stringInputTask);taskList.add(stringInputTask2);taskList.add(stringInputTask3);taskList.add(stringInputTask4);taskList.add(stringInputTask5);return taskList;}
}

输出:

0 [pool-1-thread-1] Starting: StringInputTask{taskName='Task 1'}0 [pool-1-thread-5] Starting: StringInputTask{taskName='Task 5'}0 [pool-1-thread-2] Starting: StringInputTask{taskName='Task 2'}2 [pool-1-thread-4] Starting: StringInputTask{taskName='Task 4'}2 [pool-1-thread-3] Starting: StringInputTask{taskName='Task 3'}3003 [pool-1-thread-5] Done: Task 53004 [pool-1-thread-3] Done: Task 33003 [pool-1-thread-1] Done: Task 13003 [pool-1-thread-4] Done: Task 43003 [pool-1-thread-2] Done: Task 23007 [Thread-0] WaitingFuturesRunner  - complete... adding results

在执行此操作时,我发现并阅读了一些有用的文章/链接:

Oracle: Lambda教程

IBM: Java 8并发

Tomasz Nurkiewicz: CompletableFuture权威指南

翻译自: https://www.javacodegeeks.com/2014/04/playing-with-java-8-lambdas-and-concurrency.html

lambda 高并发

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

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

相关文章

光纤收发器的选择与维护!

光纤收发器在弱电工程中的使用是非常普遍&#xff0c;那么&#xff0c;我们在工程项目中该如何选择光纤收发器&#xff1f;当光纤收发器出现故障问题了&#xff0c;又该如何维护呢&#xff1f;这些问题对于新手来说都是难题&#xff0c;今天杭州飞畅的小编就来为大家分享一下关…

回调地狱和反应模式

我可以更好地了解a的用途的一种方式 基于反应流的方法是它简化了无阻塞IO调用的方式。 这篇文章将快速讲解进行同步远程调用所涉及的那种代码&#xff0c;然后说明如何在非阻塞IO中分层&#xff0c;尽管在资源&#xff08;尤其是线程&#xff09;的使用方面非常高效&#xff…

光纤收发器的实际应用范围介绍

众所周知&#xff0c;光纤收发器的有很多不同的分类&#xff0c;种类很多&#xff0c;在实际使用中大多注意的是按光纤接头不同而区分的类别&#xff1a;SC接头光纤收发器和FC/ST接头光纤收发器。接下来小编就来为大家介绍下光纤收发器的具体应用范围有哪些&#xff0c;想要了解…

光纤收发器的优势介绍

提到光纤收发器&#xff0c;人们常常不免会将光纤收发器与带光口的交换机来进行比较&#xff0c;下面咱们就主要来谈一下光纤收发器相对于光口交换机的优势。想要了解的朋友就一起来看看吧&#xff01; 首先&#xff0c;光纤收发器和普通交换机在价格上远远比光口交换机便宜&a…

[渝粤教育] 南通大学 分子生物学 参考 资料

教育 -分子生物学-章节资料考试资料-南通大学【】 第二章 思考题 第二章 测试 1、【单选题】核酸的基本组成单位是 A、A.磷酸和核糖 B、B.核苷和碱基 C、C.单核苷酸 D、D.脱氧核苷和碱基 参考资料【 】 2、【单选题】DNA与RNA完全水解后&#xff0c;其产物的特点是 A、A.戊糖不…

[渝粤教育] 南通大学 大学计算机信息技术基础 参考 资料

教育 -大学计算机信息技术基础-章节资料考试资料-南通大学【】 数制转换 1、【填空题】与十六进制数(BC)16等值的八进制数是___________ 。 A、 参考资料【 】 2、【填空题】十进制数205.5的八进制表示是___________________。 A、 参考资料【 】 整数在计算机中的表示 1、【填…

Selenium脚本编写技巧和窍门

如果您刚刚开始学习硒&#xff0c;则以下技巧和窍门将成为您的救星。 这些技巧和窍门具有您可能会忘记的所有基本知识&#xff0c;将帮助您记住所有这些。 您只需浏览一下它们&#xff0c;几秒钟后您就会了解所有内容。 让我们一一看一下所有的技巧和窍门。 创建Webdriver实例…

光纤收发器在使用过程中有哪些需要注意的事项?

光纤收发器的种类非常丰富&#xff0c;而在实际使用中大多是按照光纤接头不同进行区分&#xff0c;SC接头光纤收发器和FC/ST接头光纤收发器。今天&#xff0c;飞畅科技的小编就带大家来详细了解下光纤收发器在使用过程中需要注意的事项有哪些&#xff1f;一起来看看吧&#xff…

[渝粤教育] 南通大学 电路分析 参考 资料

教育 -电路分析-章节资料考试资料-南通大学【】 随堂测验&#xff1a;关联方向和非关联方向判断 1、【填空题】图中所示的电压源电压、电流i参考方向为 方向&#xff0c;电流源电压u、电流i参考方向为 方向。 A、 参考资料【 】 随堂测验&#xff1a;电源功率计算及判断 1、【填…

光纤收发器发展趋势

现如今&#xff0c;随着互联网的高速发展&#xff0c;以太网的局域发展已经无法适应其发展了&#xff0c;因此出现了光纤收发器这种设备&#xff0c;来进行长距离的光信号输送&#xff0c;这样可以扩大光网的使用范围&#xff0c;使更多的人能够受到网络的优惠和速度。接下来飞…

[渝粤教育] 南通职业大学 混合动力汽车构造与检修 参考 资料

教育 -混合动力汽车构造与检修-章节资料考试资料-南通职业大学【】 单元测验1 1、【单选题】混合动力汽车的英文简称是&#xff08;&#xff09; A、EV B、FCV C、HEV D、HHV 参考资料【 】 2、【单选题】本课程主要讲的混合动力汽车是 A、太阳能燃油 B、燃油氢燃料 C、燃油动力…

[渝粤教育] 南阳理工学院 大学计算机基础 参考 资料

教育 -大学计算机基础-章节资料考试资料-南阳理工学院【】 第一章单元测验 1、【单选题】大学计算机中所要学习的计算思维是指( )。 A、计算机相关的知识 B、算法与设计技巧 C、知识与技巧的结合 D、蕴含在计算科学知识背后的具有贯通性和联想性的内容 参考资料【 】 2、【单选…

光纤收发器和协议转换器之间有哪些区别?

在通信网络领域&#xff0c;我们经常会用到光纤收发器和协议转换器&#xff0c;但对此不是很了解的朋友&#xff0c;往往可能会将二者搞混淆。那么&#xff0c;关于光纤收发器与协议转换器之间有什么区别呢&#xff1f;接下来就跟随杭州飞畅的小编一起来看看吧&#xff01; 光…

[渝粤教育] 周口师范学院 大学计算机基础 参考 资料

教育 -大学计算机基础-章节资料考试资料-周口师范学院【】 随堂测验 1、【单选题】计算机数据的一个基本特点是&#xff08; &#xff09;。 A、只能表示计算所用的数值 B、以各种形式存储在内存中 C、都是以二进制形式存储在存储器上 D、所有的数据按存储器类型组织 参考资料【…

长期支持对OpenJDK意味着什么?

Bruno Borges最近在推特上发布了一个有关OpenJDK的长期支持&#xff08;LTS&#xff09;的问题&#xff0c;这表明对它的真正含义还有一些困惑。 在此博客文章中&#xff0c;我将解释不同部分如何组合在一起。 那么……谁说或者说“ #OpenJDK 11”是LTS&#xff1f; 我觉得关…

光纤收发器结构介绍和故障解决

光纤收发器是一款高集成度的设备&#xff0c;最多可集成14台光纤收发器并进行统一供电&#xff0c;结构简单&#xff0c;便于管理和维护。光纤收发器包括百兆/千兆&#xff0c;单纤/双纤、单模/多模等多种规格。光纤收发器支持每台光纤收发器的热插拔操作&#xff0c;使用非常灵…

[渝粤教育] 四川信息职业技术学院 高频电子技术 参考 资料

教育 -高频电子技术-章节资料考试资料-四川信息职业技术学院【】 无线通信系统 1、【单选题】下列表述正确的是&#xff08; &#xff09; A、低频信号可直接从天线上有效地辐射 B、低频信号必须装载到高频信号上才能有效地辐射 C、低频信号和高频信号都不能从天线上有效地辐射…

[渝粤教育] 四川农业大学 理论力学 参考 资料

教育 -理论力学-章节资料考试资料-四川农业大学【】 第2讲 单元测试 1、【单选题】以下说法中错误的是( ) A、理论力学是研究物体机械运动一般规律的科学。 B、理论力学与物理中力学部分的主要区别在于理论力学的研究对象和研究方法更加面向工程实际。 C、刚体是理论力学中的重…

[渝粤教育] 四川大学 工程水文学 参考 资料

教育 -工程水文学-章节资料考试资料-四川大学【】 绪论问答题 第一章测试 1、【单选题】水文现象的发生 A、完全是偶然性的 B、完全是必然性的 C、完全是随机性的 D、既有必然性也有随机性 参考资料【 】 2、【单选题】水文分析与计算&#xff0c;是预计水文变量在[ ]的概率分布…

光纤收发器怎么连接?光纤收发器连接方式解析

光纤收发器将以太网中的连接介质转换为光纤&#xff0c;由于光纤的低损耗、高抗电磁干扰性&#xff0c;从而使网络传输距离从200米扩展到2公里甚至几十公里&#xff0c;乃至于上百公里的同时&#xff0c;也使数据通讯质量有了较大提高。光纤收发器使服务器、中继器、集线器、终…