1

何か間違ったことをしていることはわかっています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 を「同期」するようにコードを修正するにはどうすればよいですか?

4

3 に答える 3

0

変化

listBufferOfInts ++= List(elem)

synchronized {
    listBufferOfInts ++= List(elem)
}

それを機能させます。おそらくパフォーマンスの問題になる可能性がありますか?私はまだ説明に興味があり、おそらく物事を行うためのより良い方法です!

于 2016-05-19T00:46:44.123 に答える