#scala #deadlock
#scala #взаимоблокировка
Вопрос:
Почему следующий код создает взаимоблокировку:
object Test extends Application
{
def printProgress(i:Int) =
{
println("Processed " i)
}
println("A")
(1 to 1000).par.foreach{ i =>
printProgress(i)
}
println("B")
}
(т. е. A
печатается, но ни B
ни одна из Processed ...
строк не печатается.)
Однако следующий код не приводит к взаимоблокировке:
object Test extends Application
{
println("A")
(1 to 1000).par.foreach{ i =>
println("Processed " i)
}
println("B")
}
(т. Е. Все печатается.)
Я использую Scala версии 2.9.1.final.
Комментарии:
1.
warning: there were 1 deprecation warnings
это намек на то, что все не совсем так![]()
Ответ №1:
Вероятно, потому, что вы расширяете приложение, в то время как я не мог сказать, в чем разница между вашими двумя примерами.
В приложении код выполняется вне метода main
, при инициализации класса. На данный момент JVM сильно ограничена, особенно в отношении многопоточности. Приложение устарело в пользу приложения, которое обладает некоторой магией (черта DelayedInit), которая заставляет код выполняться в main
. Так что object Test extends App
следует это исправить.
Комментарии:
1. Это волшебный ответ, я буду иметь это в виду в отношении моей будущей работы. XD