通过线程池方式改造Stream.parallel()并行流

news2024/10/7 10:19:21

在这里插入图片描述

目录

    • 一、IntStream.rangeClosed并行流
    • 二、线程池方式改造
      • 1、创建线程池
      • 2、线程类
      • 3、信心满满,走起来
    • 三、再次解决并发时i++原子性问题
    • 四、并行流与多线程
      • 1、并行和并发的区别?
      • 2、并行和并发的使用场景

大家好,我是哪吒。

上一篇简单聊一聊公平锁和非公平锁,parallel并行流,提到了一个IntStream.rangeClosed并行流问题,很多小伙伴,对这个比较陌生,想用线程池的方式改造一下。

一、IntStream.rangeClosed并行流

@Data
public class LockTest1 {
    public static void main(String[] args) {
        IntStream.rangeClosed(1, 100000).parallel().forEach(i -> new LockTest1().increase());
        System.out.println(time);
    }

    private static int time = 0;

    private static Object lock = new Object();
    public void increase() {
        synchronized (lock) {
            time++;
        }
    }
}

二、线程池方式改造

不会那些新特性,还是原始的香啊,写起代码,得心应手。

1、创建线程池

这时候,有些小伙伴,又陷入了选择恐惧症。用哪个线程池比较好呢?

简单回顾一下:

  1. 单线程池newSingleThreadExecutor(),只有一个核心线程的线程池,保证任务按FIFO顺序一个个执行;
  2. 固定线程数线程池newFixedThreadPool(10),固定数量的可复用的线程数,来执行任务。当线程数达到最大核心线程数,则加入队列等待有空闲线程时再执行;
  3. 可缓存线程池newCachedThreadPool(),创建的都是非核心线程,而且最大线程数为Interge的最大值,空闲线程存活时间是1分钟。如果有大量耗时的任务,则不适该创建方式,它只适用于生命周期短的任务;
  4. 固定线程数newScheduledThreadPool(10),支持定时和周期性任务newScheduledThreadPool(10),顾名思义,在固定线程数的前提下,添加了定时任务。

最常用的还是固定线程数线程池newFixedThreadPool(10)。

@Data
public class LockTest2 {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(200);
        for (int i = 0; i < 100000; i++) {
            Thread0926 thread = new Thread0926();
            executorService.execute(thread);
        }
        System.out.println(time);
    }

    private static int time = 0;
    private static Object lock = new Object();
    public void increase() {
        synchronized (lock) {
            time++;
        }
    }
}

2、线程类

public class Thread0926 implements Runnable{
    @Override
    public void run() {
        LockTest2 lockTest = new LockTest2();
        lockTest.increase();
    }
}

3、信心满满,走起来

我草,这不对啊,不应该是100000嘛?又把老子整不会了~

在这里插入图片描述

三、再次解决并发时i++原子性问题

上一篇测试过,使用synchronized代码块是可以解决i++线程安全问题的,这次怎么不好使了?

上面的代码中,synchronized (lock)锁住了time++,lock是静态变量,所以属于类级别的锁。但是新建的线程是一个新的类,超出了锁的范围,所以失效。

那么,在当前类中,开启线程,是不是就可以了呢?试一下

public class LockTest4 {
    private static int time = 0;
    private static Object lock = new Object();
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 200; i++) {
            Thread thread = new Thread(() -> {
                for (int j = 0; j < 500; j++) {
                    synchronized (lock) {
                        time++;
                    }
                }
            });
            thread.start();
        }
        Thread.sleep(3000);
        System.out.println(time);
    }
}

当然,在synchronized代码块中,使用synchronized (LockTest4.class)也是可以的,效果是一样的。

在这里插入图片描述

四、并行流与多线程

并行流的本质的是并行,多线程的本质是并发。

并行指当多核CPU中的一个CPU执行一个线程时,其它CPU能够同时执行另一个线程,两个线程之间不会抢占CPU资源,可以同时运行。

并发指在一段时间内CPU处理多个线程,这些线程会抢占CPU资源,CPU资源根据时间片周期在多个线程之间来回切换,多个线程在一段时间内同时运行,而在同一时刻不是同时运行的。

1、并行和并发的区别?

  1. 并行指多个线程在一段时间的每个时刻都同时运行,并发指多个线程在一段时间内同时运行(不是同一时刻,一段时间内交叉执行)
  2. 并行的多个线程不会抢占系统资源,并发的多个线程会抢占系统资源;
  3. 并行是多CPU的产物,单核CPU中只有并发,没有并行;

在这里插入图片描述

2、并行和并发的使用场景

(1)IO密集场景

场景应用程序开发,提供http接口、数据库查询、微服务调用都是IO请求,IO请求时几乎不消耗cpu,这是为了提供cup使用率,建议使用多线程并发,线程数可以远大于cpu核数。

(2)cup密集场景

对应大量的加减乘除运算、md5、hash等运算操作,需要持续使用cpu,需要让多核cpu并行运算,适合使用forkjoin并行计算

技术场景多线程不足,使用多线程技术,也能提高性能,但是线程设置过大会浪费cpu线程切换的时间,如果线程任务分配不均匀,会导致有的cpu忙碌有的cpu空闲。

上一篇:一个关于 i++ 和 ++i 的面试题打趴了所有人

下一篇:越细粒度的锁越好吗?产生死锁怎么办?

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

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

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

相关文章

从解决问题到人生规划

从解决问题到人生规划&#xff0c;如何通过深度思考&#xff0c;让自己成为这个世界上最顶级的人才&#xff1f; 我们对于问题的理解一般有6个层次&#xff0c;每个层次的深度不同&#xff0c;决定了我们思考的深度和看问题的眼界。 首先&#xff0c;来想象这样一个场景&#x…

graphviz 绘制二叉树

代码 digraph BalancedBinaryTree {node [fontname"Arial", shapecircle, stylefilled, color"#ffffff", fillcolor"#0077be", fontsize12, width0.7, height0.7];edge [fontname"Arial", fontsize10, color"#333333", arr…

上海亚商投顾:沪指冲高回落 医药、芯片股全天领涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日小幅反弹&#xff0c;创业板指盘中涨超1.6%&#xff0c;午后涨幅有所收窄。医药医疗股全线走强&#…

俩个el-select的联动选择

需求&#xff1a; 1.有俩个select下拉框&#xff0c;之后左边选中后右边根据左边的选择自动选择内容 2.右边自动选择之后可以取消。 3.右侧的下拉框只能选中左侧下拉框的内容&#xff0c;左边没选中的右边也不能被选中 4.左侧下拉添加全选功能 5.左侧选择右侧没选择就把右侧数据…

如何避免 IDEA 每次重启都index

如何避免 IDEA 每次重启都index 在 IntelliJ IDEA 中&#xff0c;可以通过以下几个步骤来避免每次重启时索引&#xff1a; 打开 File -> Settings 菜单。在左侧的菜单栏中选择 “Appearance & Behavior” -> “System Settings” -> “Synchronization”。 在右…

与艺术同频!卡萨帝在海外崭露头角

在品牌全球化步伐日益加快的当下&#xff0c;高端品牌如何真正实现业务全球化、品牌全球化乃至用户圈层全球化&#xff1f; 作为国际高端家电引领者&#xff0c;卡萨帝今年以来在全球范围内展开了一系列的品牌布局活动。1月&#xff0c;卡萨帝于巴基斯坦召开品牌发布会&#x…

生产ERP管理系统源码 ERP系统源码

生产ERP管理系统 1、产品管理系统 产品资料系统包括两方面的内容&#xff1a;物料主文件和产品结构&#xff0c;ERP系统企业管理软件平台最基本的信息&#xff0c;绝大多数物流、制造、甚至财务类系统均要使用到产品资料的信息。 &#xff08;1&#xff09;、全方位描述物料…

网工实验笔记:匹配工具ACL的使用

一、概述 访问控制列表简称为ACL&#xff0c;它使用包过滤技术&#xff0c;在路由器上读取第3层及第4层包头中的信息&#xff0c;如源地址、目的地址、源端口和目的端口等&#xff0c;根据预告定义好的规则对包进行过滤从而达到访问控制的目的。ACL分很多种&#xff0c;不同场…

用ChatGPT+Midjourney 5分钟生成30条爆款小红书图文(内有详细教程)

本期是赤辰第35期AI项目教程&#xff0c;文章底部准备了粉丝福利&#xff0c;看完后可免费领取&#xff01;今天给大家讲一下如何5分钟生成30条爆款小红书图文先说个账号&#xff0c;这个应该有同学也看过&#xff0c;前几个月在小红书有个涨粉很快的AI绘画项目&#xff0c;就是…

python自动化操作邮箱

POP3、IMAP、SMTP&#xff0c;CardDAV、CalDAV协议特点 POP3 POP3是Post Office Protocol 3的简称&#xff0c;即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服…

微信小程序支持h5实现webrtc h264 h265低延迟传输渲染

微信小程序自成体系&#xff0c;自身也带了很强的rtc音视频能力&#xff0c;但是他捆绑了他自己的服务&#xff0c;开发也相对受限于他的api。基于以前的了解可以采webview的方式内嵌h5网址来实现自定义的webrtc.但实践起来并不轻松&#xff0c;主要是小程序的严格限制&#xf…

docker-compose Install hfish

前言hfish HFish是一款社区型免费蜜罐,侧重企业安全场景,从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发,为用户提供可独立操作且实用的功能,通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的能力。 HFish具有超过40种蜜罐环境、提供免费…

VS编译的时候不生成Release文件夹

方法描述&#xff1a; Build>Configuration Manager>Release 编译》配置管理》选择发布版本 再编译就有了 具体操作过程 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 特此记录 anlog 2023年10月12日

在线答题+考试出题小程序源码系统,轻松无忧,功能强大

今天给大家分享一款在线答题小程序源码系统&#xff0c;功能强大&#xff0c;搭建起来也比较简单&#xff0c;同时还具有在线考试&#xff0c;轻松出题的功能&#xff0c;适用于各个行业。 功能展示具体罗列部分如下&#xff1a; 基础设置&#xff08;全局设置&#xff0c;…

信创办公–基于WPS的PPT最佳实践系列 (绘制自选图形)

信创办公–基于WPS的PPT最佳实践系列 &#xff08;绘制自选图形&#xff09; 目录 应用背景操作步骤1、记忆复制&#xff1a;CTRLD2、微移&#xff1a;CTRL四个方向键 应用背景 如果想将文字转为简单而形象的smartart图形&#xff0c;但是又找不到自己想要的图形&#xff0c;我…

14.2 Socket 反向远程命令行

在本节&#xff0c;我们将继续深入探讨套接字通信技术&#xff0c;并介绍一种常见的用法&#xff0c;实现反向远程命令执行功能。对于安全从业者而言&#xff0c;经常需要在远程主机上执行命令并获取执行结果。本节将介绍如何利用 _popen() 函数来启动命令行进程&#xff0c;并…

实现paho.mqtt.cpp库编译

编译环境 WIN10 VS2019 CMake 3.27.4 因为paho.mqtt.cpp依赖paho.mqtt.c 安装paho.mqtt.c 先下载paho.mqtt.c安装包&#xff0c;win下有安装包 地址: https://github.com/eclipse/paho.mqtt.c/releases/tag/v1.3.12 编译paho.mqtt.cpp 然后下载 paho.mqtt.cpp 源码Release…

【Python 零基础入门】 函数

【Python 零基础入门】第五课 函数 【Python 零基础入门】第五课 函数函数在生活中的类比函数为什么要使用函数函数的格式无参函数含参函数 参数形参实参 变量作用域局部变量全局变量 递归函数基本的递归斐波那契数列 Lambda 表达式高阶函数map 函数filter 函数reduce 函数结合…

COSCon'23 闪电演讲报名须知

各位新老朋友们&#xff0c;一年一度的中国开源年会&#xff08;COSCon&#xff09;拟于 2023 年 10 月 28 日&#xff08;星期六&#xff09;- 29 日&#xff08;星期日&#xff09;在四川省成都市高新区菁蓉汇举办。 本次大会将持续两天&#xff0c;我们策划的主题包括&#…

[探究] program break (chatgpt 协助)

文章目录 简介Unix早期和程序断点引入malloc安全顾虑和转向更新内存分配器新用法中的程序断点总结 简介 这里说的程序断点&#xff08;program break&#xff09;和 gdb调试时的断点&#xff08;运行断点&#xff09;&#xff0c;意思不同。 当深入研究Linux和类Unix操作系统…