并行集合

为了更好地利用计算机多个处理器,支持并发开发是必需的。

Scala提供的用于操作大型集合的解决方案,这些任务通常可以自然地并进操作。

例如:要计算集合所有元素的总和,多个线程可以并发地计算不同区块的和,最后这些部分的结果被汇总到一起。

 

串行集合和并行集合之间的转换

package main

object Test {

  def main(args: Array[String]): Unit = {

    val list = scala.collection.mutable.Seq(1 to 100: _*);
    println(list.getClass.getName); //scala.collection.mutable.ArrayBuffer
    println(list.sum);
    //5050


    //转 并行集合

    val parList = list.par;
    println(parList.getClass.getName); //scala.collection.parallel.mutable.ParArray
    println(parList.sum);
    //5050

    val parArray = list.toParArray;
    println(parArray.getClass.getName); //scala.collection.parallel.mutable.ParArray
    println(parArray.sum);
    //5050


    //并行集合 转回 串行集合

    val seqList = parList.seq;
    println(seqList.getClass.getName); //scala.collection.parallel.mutable.ExposedArraySeq
    println(seqList.sum);
    //5050

    val toSeqList = parArray.seq;
    println(toSeqList.getClass.getName); //scala.collection.parallel.mutable.ExposedArraySeq
    println(toSeqList.sum);
    //5050
  }
}

 

并发集合配置

TaskSupport 实现了对并发集合操作的调度。每一个并发集合都包含一个对 TaskSupport 具体实例的引用。

如果没有为并发集合显示IDE传入一个 TaskSupport ,则它会使用默认的TaskSupport 。

TaskSupport 负责调度和负载均衡操作任务,它在内部保持对一个线程池的引用,并且决定何时以何种方式将任务分解。

当前有三个 TaskSupport 的实现类:

1、ForkJoinTaskSupport 

2、ExecutionContextTaskSupport  

3、ThreadPoolTaskSupport(已过时)

package main

import scala.collection.parallel.{ExecutionContextTaskSupport, ForkJoinTaskSupport, ThreadPoolTaskSupport}

object Test {

  def main(args: Array[String]): Unit = {

    val list = scala.collection.mutable.Seq(1 to 100: _*);

    val parList = list.par;
    parList.tasksupport = new ForkJoinTaskSupport(new scala.concurrent.forkjoin.ForkJoinPool(2));
  }
}
package main

import scala.collection.parallel.{ExecutionContextTaskSupport, ForkJoinTaskSupport, ThreadPoolTaskSupport}

object Test {

  def main(args: Array[String]): Unit = {

    val list = scala.collection.mutable.Seq(1 to 100: _*);

    val parList = list.par;
    parList.tasksupport = new ExecutionContextTaskSupport();
  }
}
package main

import scala.collection.parallel.{ExecutionContextTaskSupport, ForkJoinTaskSupport, ThreadPoolTaskSupport}

object Test {

  def main(args: Array[String]): Unit = {

    val list = scala.collection.mutable.Seq(1 to 100: _*);

    val parList = list.par;
    parList.tasksupport = new ThreadPoolTaskSupport();
  }
}

 

posted @ 2019-07-27 01:46  茗::流  阅读(221)  评论(0)    收藏  举报
如有雷同,纯属参考。如有侵犯你的版权,请联系我。