所以,我有一部分代码如下所示。
for(a <- 0 until segments)
{
// do something with elements at index a
}
什么是最简单的多线程类型,它允许我在一个单独的线程中执行该循环的每个元素。我还有每个线程需要访问的全局集合(由a索引)。我在互联网上看到的只是期货和演员,但它们很难掌握。我想要一些像OpenMP一样简单的东西。
我尝试了以下操作,但它给了我错误';' expected but '.' found. }} thread.start
。
for (a <- 0 until segments) {
val thread = new Thread {
override def run {
// do something with elements at index a
}} thread.start
}
答案 0 :(得分:5)
我认为你正在为副作用执行代码。
以下代码有效。您收到错误,因为thread.start
应该在一个单独的行中。
for (a <- 0 until 10) {
val thread = new Thread {
override def run(): Unit = {
// code
}
}
thread.start()
}
你可以用期货替换它,使用一个线程池,它比产生大量线程要好得多。
for (a <- 0 until 10) {
Future {
// code
}
}
然而,在任何一种情况下,你都无法等到它完成。您可以遍历该范围并返回Future
,其中包含您使用第二个函数开始的每个期货的所有部分结果的列表。
val result: Future[List[Unit]] = Future.traverse((0 until 10).toList)(index => Future {
// code
})
有一个Future
结果,你可以等待它,即阻塞调用线程直到所有计算完成。
import scala.concurrent.duration._
import scala.concurrent.Await
Await.ready(result, 1.hour)
使用Await.result
获取结果,Await.ready
只需等到将来完成。
要等待启动它们时需要构建列表的线程,然后在每个线程上调用join
。
我认为您不需要更改现有代码以使用并行集合,但我可能不知道您的代码特有的内容。以下代码会将范围拆分为将并行处理的块。
for (a <- (0 until 10).par) {
// code
}
对于并行集合,您无需等待,线程将被阻止,直到处理完所有内容。
答案 1 :(得分:1)
并行集合是错误的:它们不会要求您更改任何超出实际想要更改的代码:
(0 until segments).par.foreach { a =>
// code
}