所以,我有一部分代码如下所示。
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
}
我假设您正在执行仅针对副作用的代码。
以下代码有效。你得到一个错误,因为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
}
使用并行集合,您无需等待,线程将被阻止,直到处理完所有内容。
并行集合是错误的:它们不会要求您更改任何代码,而不是您实际想要更改的代码:
(0 until segments).par.foreach { a =>
// code
}