Java Stream与多线程

Java Stream

1. 问题引入

学习了尚硅谷的JUC,周阳老师讲的商城比较价格的案例,自己模拟了一个多线程的demo, 多线程处理任务并且汇总结果,出现了疑问,实例代码放在下面,读者有兴趣的话可ctrl+cv玩一玩

如下是自定义的任务类

public class Task implements Callable<String> {private String taskName;private Date taskTime;// 构造函数,toString那些略去//这里是因为前面还弄了线程池处理任务并且汇总结果的,所以实现了Callable接口,//这个可以略过不看,因为疑问跟这个无关@Overridepublic String call() throws Exception {try {System.out.println("正在处理任务" + this.getTaskName());Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);} finally {return this.getTaskName();}}}

Main方法

package com.manytask02;import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;
import java.util.stream.Collectors;// 主方法
public class Main {public static void main(String[] args) {// 1.顺序处理任务//testOrder();//2.CompletableFuturetry {testCompletable();} catch (ExecutionException e) {throw new RuntimeException(e);} catch (InterruptedException e) {throw new RuntimeException(e);}}// 顺序处理任务方法public static void testOrder() {List<Task> tasks = new ArrayList<>();// 创建一系列任务 ( 5个任务)for ( int i = 0; i < 5; ++i ) {tasks.add(new Task("任务" + i, new Date()));}// 一 顺序处理System.out.println("顺序处理任务开始了~~~~~~~");long start = System.currentTimeMillis();List<String> strings = takcleByOrder(tasks);long end = System.currentTimeMillis();System.out.println("顺序处理任务耗时 " + (end-start));//返回处理结果strings.forEach(System.out::println);}public static List<String> takcleByOrder(List<Task> tasks) {List<String> ans = new ArrayList<>();for (Task task : tasks) {ans.add(takcleTask(task));}return ans;}//========================================================================// CompletableFuture工具public static void testCompletable() throws ExecutionException, InterruptedException {List<Task> tasks = new ArrayList<>();// 创建一系列任务 ( 5个任务)for ( int i = 0; i < 5; ++i ) {tasks.add(new Task("任务" + i, new Date()));}// 一 异步处理System.out.println("异步处理任务开始了~~~~~~~");long start = System.currentTimeMillis();List<String> strings = takcleByAsync02(tasks);long end = System.currentTimeMillis();System.out.println("异步处理任务耗时 " + (end-start));//返回处理结果strings.forEach(System.out::println);}private static List<String> takcleByAsync02(List<Task> tasks) {return  tasks.stream().map(task -> CompletableFuture.supplyAsync(()->takcleTask(task))).collect(Collectors.toList()).stream().map(CompletableFuture::join).collect(Collectors.toList());//        return  tasks.stream()
//                .map(task -> CompletableFuture.supplyAsync(()->takcleTask(task)))
//                .map(CompletableFuture::join)
//                .collect(Collectors.toList());}
}

疑问出来了,如下图

在这里插入图片描述

上图中两个红框框中就出现了疑问,第一个红框框中划线的部分,既然前后结果类型一样,为什么不能写成下面的两个map那种形式呢??

从上面主方法(main)代码可以看出,是在比较顺序处理任务和异步处理任务所花费的时间。可是事实却是:写成下面的形式,就不是异步处理任务了,耗时还是5秒。为什么呢,难道是两个map连着一起写有问题吗?

猜想:两个map连着一起写的话,第一个map里面执行了,会紧接着执行另一个map里面的操作,并不是等一个map将流中的所有元素映射完了才执行第二个map里面的映射,由于CompletableFuture的join方法会阻塞,每当第一个map处理任务时,紧接着就执行join了,造成了阻塞,这就相当于是在顺序执行任务了。

public class Mapmap {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 3, 5, 7, 9);List<Integer> integers = list.stream().map(i -> {i *= 2;System.out.println(i);return i;}).map(j -> {j *= 2;System.out.println(j);return j;}).collect(Collectors.toList());}
}

测试一下,如果是像猜想里面的那样的话,输出内容就肯定是2,4,6,12,10,20,14,28,18,36; 如果不是的话那么就是2,6,10,14,18,4,12,20,28,36

在这里插入图片描述

印证了猜想。具体什么原因我也看不懂源码

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

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

相关文章

了解 HarmonyOS

引言 在开始 HarmonyOS 开发之前&#xff0c;了解其背景、特点和架构是非常重要的。本章将为你提供一个全面的 HarmonyOS 概览。 目录 什么是 HarmonyOS HarmonyOS 的发展历程 HarmonyOS 的特点 HarmonyOS 的架构 HarmonyOS 与其他操作系统的比较 1. 什么是 HarmonyOS …

高并发幂等计数器的设计与实现

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

PSP - 蛋白质结构预测 OpenFold Multimer 训练模型的数据加载

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132597659 OpenFold Multimer 是基于深度学习的方法&#xff0c;预测蛋白质的多聚体结构和相互作用。利用大规模的蛋白质序列和结构数据&#xff…

【GUI开发】用python爬YouTube博主信息,并开发成exe软件

文章目录 一、背景介绍二、代码讲解2.1 爬虫2.2 tkinter界面2.3 存日志 三、软件演示视频四、说明 一、背景介绍 你好&#xff0c;我是马哥python说&#xff0c;一名10年程序猿。 最近我用python开发了一个GUI桌面软件&#xff0c;目的是爬取相关YouTube博主的各种信息&#…

腾讯云网站备案详细流程_审核时间说明

腾讯云网站备案流程先填写基础信息、主体信息和网站信息&#xff0c;然后提交备案后等待腾讯云初审&#xff0c;初审通过后进行短信核验&#xff0c;最后等待各省管局审核&#xff0c;前面腾讯云初审时间1到2天左右&#xff0c;最长时间是等待管局审核时间&#xff0c;网站备案…

Python Opencv实践 - 凸包检测(ConvexHull)

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/stars.png") plt.imshow(img[:,:,::-1])img_contour img.copy() #得到灰度图做Canny边缘检测 img_gray cv.cvtColor(img_contour, cv.COLOR_BGR2GRAY) edges…

手写RPC框架--2.介绍Zookeeper

RPC框架-Gitee代码(麻烦点个Starred, 支持一下吧) RPC框架-GitHub代码(麻烦点个Starred, 支持一下吧) 该项目的RPC通信将采用NettyZookeeper&#xff0c;所以会在前两章介绍使用方法 介绍Zookeeper Zookeepera.概述1) 数据模型2) Watcher机制 b.安装和基本操作1) Java操作zooke…

前端Vue仿企查查 天眼查知识产权标准信息列表组件

引入Vue仿企查查天眼查知识产权标准信息列表组件 随着技术的不断发展&#xff0c;传统的开发方式使得系统的复杂度越来越高。在传统开发过程中&#xff0c;一个小小的改动或者一个小功能的增加可能会导致整体逻辑的修改&#xff0c;造成牵一发而动全身的情况。为了解决这个问题…

C# Solidworks二次开发:创建距离配合以及移动组件API详解

今天要讲的文章是关于如何创建距离配合和移动组件的API详解。 &#xff08;1&#xff09;创建配合API&#xff0c;CreateMate() 这个API的解释是根据指定的特性数据对象来创建配合&#xff0c;也就可以理解为输入什么样的特征对象就可以创建出什么配合&#xff0c;这个API的输…

async的用法

有以下几种形式 //从c11到c17有 template< class Function, class... Args > std::future<typename std::result_of<typename std::decay<Function>::type(typename std::decay<Args>::type...)>::type>async( Function&& f, Args&…

VBA:对Excel单元格进行合并操作

Sub hb()Dim nn 3For i 3 To 18If Range("b" & i) <> Range("b" & i 1) ThenRange("b" & n & ":b" & i).Mergen i 1End IfNextEnd Sub

JavaScript -【第一周】

文章来源于网上收集和自己原创&#xff0c;若侵害到您的权利&#xff0c;请您及时联系并删除~~~ JavaScript 介绍 变量、常量、数据类型、运算符等基础概念 能够实现数据类型的转换&#xff0c;结合四则运算体会如何编程。 体会现实世界中的事物与计算机的关系理解什么是数据并…