Какие операции выполняются массово при использовании параллельных коллекций? Странное поведение здесь

Введите следующую небольшую последовательную программу и ее распараллеленную версию в Scala REPL:

/* Activate time measurement in "App" class. Prints [total <X> ms] on exit. */
util.Properties.setProp("scala.time", "true")
/* Define sequential program version. */
object X extends App { for (x <- (1 to 10)) {Thread.sleep(1000);println(x)}}
/* Define parallel program version. Note '.par' selector on Range here. */
object Y extends App { for (y <- (1 to 10).par) {Thread.sleep(1000);println(y)}}

Выполнение X с помощью X.main (Array.empty ) дает:

1
2
3
4
5
6
7
8
9
10
[total 10002ms]

В то время как Y с Y.main (Array.empty) дает:

1
6
2
7
3
8
4
9
10
5
[total 5002ms]

Пока все хорошо. Но как насчет следующих двух вариантов программы:

object X extends App {(1 to 10).foreach{Thread.sleep(1000);println(_)}}
object Y extends App {(1 to 10).par.foreach{Thread.sleep(1000);println(_)}}

Дайте мне время выполнения [всего 1002 мс] и [всего 1002 мс] соответственно. Как это может быть?

5
задан Tim Friske 18 September 2011 в 16:28
поделиться