何か間違ったことをしていることはわかっていますmutable.ListBufferが、それを修正する方法 (および問題の適切な説明) がわかりません。
動作を再現するために、以下のコードを簡略化しました。
私は基本的に、最初のリストが処理されるときに要素をリストに追加するために関数を並行して実行しようとしています。私は要素を「失う」ことになります。
import java.util.Properties
import scala.collection.mutable.ListBuffer
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}
import scala.concurrent.{ExecutionContext}
import ExecutionContext.Implicits.global
object MyTestObject {
var listBufferOfInts = new ListBuffer[Int]() // files that are processed
def runFunction(): Int = {
listBufferOfInts = new ListBuffer[Int]()
val inputListOfInts = 1 to 1000
val fut = Future.traverse(inputListOfInts) { i =>
Future {
appendElem(i)
}
}
Await.ready(fut, Duration.Inf)
listBufferOfInts.length
}
def appendElem(elem: Int): Unit = {
listBufferOfInts ++= List(elem)
}
}
MyTestObject.runFunction()
MyTestObject.runFunction()
MyTestObject.runFunction()
戻り値:
res0: Int = 937
res1: Int = 992
res2: Int = 997
1000明らかに、私は常に返されることを期待しています。「アーキテクチャ」を維持しながら ListBuffer を「同期」するようにコードを修正するにはどうすればよいですか?