Java基于fork/koin类实现并发排序

概述

主要谈一谈 Java使用fork/koin类 实现的并发排序 以及对于Stream流的支持的splitetor

  • mismatch() -> 寻找两个数组 第一次出现数据不一致的下标
  • parallelPrefix() -> 对数组进行,累加求和
  • parallelSetAll() -> 对数组进行置数,
  • parallelSort() -> 并行排序
  • Spliterator() -> 对数组进行切分(切分后的数据为所有的数据的组合)

奇数 x/2+1 11->6

偶数 x/2 10 ==>5

public class Use_Arrays {

  @Test
  public void test_mismatch() {
    int []x =new int[] {1,2,3,4};
    int []y =new int[] {1,3,4,5};
    int index = Arrays.mismatch(x, y);
    System.out.println(index);
  }

  @Test
  public void test_parallelPrefix() {
    int []x =new int[] {1,2,3,4};
    //f2=f1+f2
    //f3=f2+f3
    Arrays.parallelPrefix(x, (k,v)->k+v);
    System.out.println(Arrays.toString(x));

    // 实现1-100累加求和
    int []y =new int[100];
    Arrays.parallelSetAll(y, k->k=1);
    Arrays.parallelPrefix(y, (k,v)->k+v);
    System.out.println(Arrays.toString(y));

  }
  @Test
  public void test_parallelSetAll() {
    int []x =new int[100];
    x[0]=1;
    Arrays.parallelSetAll(x, y->y+1);
    System.out.println(Arrays.toString(x));
  }

  @Test
  public void test_parallSort() {
     IntStream stream = new Random().ints(0, 1000).limit(1000);
     int[] array = stream.toArray();
     System.out.println(Arrays.toString(array));
     Arrays.parallelSort(array);
     System.out.println(Arrays.toString(array));
  }

  @Test
  public void test_spliterator() {
    int []x =new int[11];
    Arrays.parallelSetAll(x, k->k+=1);
    System.out.println(Arrays.toString(x));

    Spliterator.OfInt int0_100 = Arrays.spliterator(x);

    int [] y=new int[(int) int0_100.estimateSize()];
    int i=0;
    System.out.println(int0_100.estimateSize());
    System.out.println(int0_100.characteristics());
    System.out.println(int0_100.getExactSizeIfKnown());

    //spliterator.forEachRemaining((int k)->System.out.println(k));

    OfInt int1_50 = int0_100.trySplit();
    OfInt int2_25 = int1_50.trySplit();
    int0_100.forEachRemaining((int k)->System.out.print(k+" "));
    System.out.println();
    int1_50.forEachRemaining((int k)->System.out.print(k+" "));
    System.out.println();
    int2_25.forEachRemaining((int k)->System.out.print(k+" "));
  }
}

2:使用Spliterator实现并行输出

@Test
  public void definied_Sort() {
     IntStream stream = new Random().ints(0, 100).limit(100);
     int[] array = stream.toArray();
     Arrays.sort(array);
     final int NUMS=3;// 切分的次数

     ExecutorService thread_pool = Executors.newFixedThreadPool(10);

     Spliterator.OfInt cut1 = Arrays.spliterator(array);
     while(!thread_pool.isTerminated()) {
       thread_pool.submit(()->{
          OfInt split = cut1.trySplit();
           thread_pool.shutdown();
         split.forEachRemaining((int k)->System.out.print(k+" "));
         System.out.println();
       });
     }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java多线程并发编程和锁原理解析

    这篇文章主要介绍了Java多线程并发编程和锁原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等方案后,问题得到解决. 加锁方案见下文. 二.乐观锁 & 悲观锁 1.乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁

  • 浅谈Java Fork/Join并行框架

    初步了解Fork/Join框架 Fork/Join 框架是java7中加入的一个并行任务框架,可以将任务分割成足够小的小任务,然后让不同的线程来做这些分割出来的小事情,然后完成之后再进行join,将小任务的结果组装成大任务的结果.下面的图片展示了这种框架的工作模型: 使用Fork/Join并行框架的前提是我们的任务可以拆分成足够小的任务,而且可以根据小任务的结果来组装出大任务的结果,一个最简单的例子是使用Fork/Join框架来求一个数组中的最大/最小值,这个任务就可以拆成很多小任务,大任务就是

  • java8中forkjoin和optional框架使用

    并行流与串行流 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流. java 8 中将并行进行了优化,我们可以很容易的对数据进行并行操作.Stream API 可以声明性地通过 parallel()与 sequential()在并行流与顺序流之间进行切换. 了解 Fork/Join 框架 Fork/Join 框架:就是在必要的情况下,将一个大任务,进形拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运行的结果进行join汇总. Fork/Join 框架

  • Java并发 CompletableFuture异步编程的实现

    前面我们不止一次提到,用多线程优化性能,其实不过就是将串行操作变成并行操作.如果仔细观察,你还会发现在串行转换成并行的过程中,一定会涉及到异步化,例如下面的示例代码,现在是串行的,为了提升性能,我们得把它们并行化. // 以下两个方法都是耗时操作 doBizA(); doBizB(); //创建两个子线程去执行就可以了,两个操作已经被异步化了. new Thread(()->doBizA()) .start(); new Thread(()->doBizB()) .start(); 异步化,是

  • java 并发编程之共享变量的实现方法

    可见性 如果一个线程对共享变量值的修改, 能够及时的被其他线程看到, 叫做共享变量的可见性. Java 虚拟机规范试图定义一种 Java 内存模型 (JMM), 来屏蔽掉各种硬件和操作系统的内存访问差异, 让 Java 程序在各种平台上都能达到一致的内存访问效果. 简单来说, 由于 CPU 执行指令的速度是很快的, 但是内存访问的速度就慢了很多, 相差的不是一个数量级, 所以搞处理器的那群大佬们又在 CPU 里加了好几层高速缓存. 在 Java 内存模型里, 对上述的优化又进行了一波抽象. JM

  • Java线程池ForkJoinPool实例解析

    这篇文章主要介绍了Java线程池ForkJoinPool实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 背景:ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个"小任务",把多个"小任务"放到多个处理器核心上并行执行:当多个"小任务"执行完成之后,再将这些执行结果合并起来即可.这种思想值得学习. import java.io.IOExcept

  • Java ForkJoin框架的原理及用法

    这篇文章主要介绍了Java ForkJoin框架的原理及用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 ForkJoin分析 一.ForkJoin ForkJoin是由JDK1.7后提供多线并发处理框架.ForkJoin的框架的基本思想是分而治之.什么是分而治之?分而治之就是将一个复杂的计算,按照设定的阈值进行分解成多个计算,然后将各个计算结果进行汇总.相应的ForkJoin将复杂的计算当做一个任务.而分解的多个计算则是当做一个子任务. 二

  • Java基于fork/koin类实现并发排序

    概述 主要谈一谈 Java使用fork/koin类 实现的并发排序 以及对于Stream流的支持的splitetor mismatch() -> 寻找两个数组 第一次出现数据不一致的下标 parallelPrefix() -> 对数组进行,累加求和 parallelSetAll() -> 对数组进行置数, parallelSort() -> 并行排序 Spliterator() -> 对数组进行切分(切分后的数据为所有的数据的组合) 奇数 x/2+1 11->6 偶数

  • 基于Java中的StringTokenizer类详解(推荐)

    StringTokenizer是字符串分隔解析类型,属于:Java.util包. 1.StringTokenizer的构造函数 StringTokenizer(String str):构造一个用来解析str的StringTokenizer对象.java默认的分隔符是"空格"."制表符('\t')"."换行符('\n')"."回车符('\r')". StringTokenizer(String str,String delim)

  • Java基于装饰者模式实现的图片工具类实例【附demo源码下载】

    本文实例讲述了Java基于装饰者模式实现的图片工具类.分享给大家供大家参考,具体如下: ImgUtil.java: /* * 装饰者模式实现图片处理工具类 * 类似java的io流 - * Img类似低级流可以独立使用 * Press和Resize类似高级流 * 需要依赖于低级流 */ package util; import java.io.File; import java.util.List; /** * 图片工具类(装饰者)和图片(被装饰者)的公共接口 * @author xlk */

  • JAVA中Collections工具类sort()排序方法

    本问介绍了Collections工具类两种sort()方法,具体如下: 一.Collections工具类两种sort()方法 格式一: public static <T extends Comparable<? super T>> void sort(List<T> list) 说明:该方法中的泛型<T>都是Comparable接口的子类,即只有是Comparable接口子类类型的数据,才能进行比较排序.如果其他类型的数据要进行比较排序,必须继承Compar

  • Java基于二叉查找树实现排序功能示例

    本文实例讲述了Java基于二叉查找树实现排序功能.分享给大家供大家参考,具体如下: /** * 无论排序的对象是什么,都要实现Comparable接口 * * @param <T> */ public class BinaryNode<T extends Comparable<T>> { private static int index = 0; // 排序下标 private static int len = 0; // 最大数组长度 private T t; //

  • Java使用Collections工具类对List集合进行排序

    这篇文章主要介绍了Java使用Collections工具类对List集合进行排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.说明 使用Collections工具类的sort方法对list进行排序 新建比较器Comparator 二.代码 排序: import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import jav

  • 基于Java创建一个订单类代码实例

    这篇文章主要介绍了基于Java创建一个订单类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求描述 定义一个类,描述订单信息 订单id 订单所属用户(用户对象) 订单所包含的商品(不定数量个商品对象) 订单总金额 订单应付金额: 总金额500~1000,打折85折 总金额1000~1500,打折80折 总金额1500~2000,打折70折 总金额超过2000,打折65折 在此基础上,还要看用户的vip等级 用户vip等级为:一般会员,

  • 一篇看懂Java中的Unsafe类

    前言 本文主要给大家介绍了关于Java中Unsafe类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 1.Unsafe类介绍 Unsafe类是在sun.misc包下,不属于Java标准.但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty.Hadoop.Kafka等. 使用Unsafe可用来直接访问系统内存资源并进行自主管理,Unsafe类在提升Java运行效率,增强Java语言底层操作能力方面起了很大的作用. Un

  • java基于jdbc连接mysql数据库功能实例详解

    本文实例讲述了java基于jdbc连接mysql数据库的方法.分享给大家供大家参考,具体如下: 一.JDBC简介 Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法.JDBC也是Sun Microsystems的商标.它JDBC是面向关系型数据库的. 1.JDBC架构: JDBC API支持两层和三层处理模型进行数据库访问,但在一般的JDBC体系结构由

  • java基于ConcurrentHashMap设计细粒度实现代码

    细粒度锁: java中的几种锁:synchronized,ReentrantLock,ReentrantReadWriteLock已基本可以满足编程需求,但其粒度都太大,同一时刻只有一个线程能进入同步块,这对于某些高并发的场景并不适用.比如银行客户a向b转账,c向d转账,假如这两个线程并发,代码其实不需要同步.但是同时有线程3,e向b转账,那么对b而言必须加入同步.这时需要考虑锁的粒度问题,即细粒度锁. 网上搜寻了一些关于java细粒度锁的介绍文章,大部分是提供思路,比如乐观锁,String.i

随机推荐