当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2023-10-13 14:36:41 398观看
导读大家好,我是哪吒。上一篇简单聊一聊公平锁和非公平锁,parallel并行流,提到了一个IntStream.rangeClosed并行流问题,很多小伙伴,对这个比较陌生,想用线程池的方式改造一下。一、IntStream.rangeClosed并行流@Datapublic clas

NkQ28资讯网——每日最新资讯28at.com

大家好,我是哪吒。

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

一、IntStream.rangeClosed并行流

@Datapublic 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++;        }    }}

二、线程池方式改造

不会那些新特性,还是原始的香啊,写起代码,得心应手。NkQ28资讯网——每日最新资讯28at.com

1、创建线程池

这时候,有些小伙伴,又陷入了选择恐惧症。用哪个线程池比较好呢?NkQ28资讯网——每日最新资讯28at.com

简单回顾一下:NkQ28资讯网——每日最新资讯28at.com

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

最常用的还是固定线程数线程池newFixedThreadPool(10)。NkQ28资讯网——每日最新资讯28at.com

@Datapublic 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嘛?又把老子整不会了~NkQ28资讯网——每日最新资讯28at.com

NkQ28资讯网——每日最新资讯28at.com

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

上一篇测试过,使用synchronized代码块是可以解决i++线程安全问题的,这次怎么不好使了?NkQ28资讯网——每日最新资讯28at.com

上面的代码中,synchronized (lock)锁住了time++,lock是静态变量,所以属于类级别的锁。但是新建的线程是一个新的类,超出了锁的范围,所以失效。NkQ28资讯网——每日最新资讯28at.com

那么,在当前类中,开启线程,是不是就可以了呢?试一下NkQ28资讯网——每日最新资讯28at.com

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)也是可以的,效果是一样的。NkQ28资讯网——每日最新资讯28at.com

NkQ28资讯网——每日最新资讯28at.com

四、并行流与多线程

并行流的本质的是并行,多线程的本质是并发。NkQ28资讯网——每日最新资讯28at.com

并行指当多核CPU中的一个CPU执行一个线程时,其它CPU能够同时执行另一个线程,两个线程之间不会抢占CPU资源,可以同时运行。NkQ28资讯网——每日最新资讯28at.com

并发指在一段时间内CPU处理多个线程,这些线程会抢占CPU资源,CPU资源根据时间片周期在多个线程之间来回切换,多个线程在一段时间内同时运行,而在同一时刻不是同时运行的。NkQ28资讯网——每日最新资讯28at.com

1、并行和并发的区别?

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

NkQ28资讯网——每日最新资讯28at.com

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

(1)IO密集场景

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

(2)cup密集场景

对应大量的加减乘除运算、md5、hash等运算操作,需要持续使用cpu,需要让多核cpu并行运算,适合使用forkjoin并行计算NkQ28资讯网——每日最新资讯28at.com

技术场景多线程不足,使用多线程技术,也能提高性能,但是线程设置过大会浪费cpu线程切换的时间,如果线程任务分配不均匀,会导致有的cpu忙碌有的cpu空闲。NkQ28资讯网——每日最新资讯28at.com

NkQ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-13282-0.html通过线程池方式改造Stream.parallel()并行流

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: C# Dev Kit for Visual Studio Code 用法详解

下一篇: Java中equals和==的区别

标签:
  • 热门焦点
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 轿车从天而降电动车主被撞身亡 超速抢道所致:现场视频让网友吵翻

    近日,上海青浦区法院判决轿车从天而降电动车主被撞身亡案,轿车车主被判有期徒刑一年。案件显示当时男子驾驶轿车在上海某路段行驶,前车忽然转弯提速超车,
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top