并行集合
为了更好地利用计算机多个处理器,支持并发开发是必需的。
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(); } }

浙公网安备 33010602011771号