@adreSsS

Почему программа завершается?

object test {
  def main(args: Array[String]) {
    val buf: ArrayBlockingQueue[Integer] = new ArrayBlockingQueue(5)

    for (p <- 1 to 2)
      ExecutionContext.global.execute(() =>
        for (i <- 1 to 10) {println(s"Producer$p producing $i"); buf.put(i)}
      )

    for (c <- 1 to 3)
      ExecutionContext.global.execute(() =>
        for (i <- 1 to 10) {println(s"Consumer$c consumed ${buf.take}")}
      )
    Thread.sleep(1000)
  }
}

Здраствуйте, такой вопрос по коду выше. Почему программа завершается?
Я думал, что вышеуказанная программа должна зависнуть, потому что ArrayBlockingQueue пуста, Producer`ов есть меньше чем Consumer и Consumer больше нечего убирать с queue.
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ответы на вопрос 1
@wng
Причина в ExecutionContext.global - он создается на основе фабрики потоков с флагом "daemon", который как раз позволяет JVM завершиться если не осталось других - не-daemon потоков.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы