2010-07-12 6 views
13

Скажем, у меня есть Stream, что довольно дорого для вычисления. Я могу легко создать нить, которая «вычисляет вперед» просто писать что-то вродеЧто происходит, когда Scala «Будущее» собирает мусор?

import scala.actors.Futures._ 
val s = future { stream.size } 

Если я затем выбросить ссылку на этот Future, будет этот поток будет уничтожен сборщиком мусора?

+4

Нет. Сборщик мусора никогда не убивает нитки. Вычисление может иметь побочные эффекты, о которых сборщик мусора не может знать, другими словами, поток может делать что-то важное, что сборщик мусора не может знать, поэтому он никогда не сможет безопасно остановить поток. – Jesper

ответ

14

№ Нить принадлежит планировщику. В любом случае планировщик имеет ссылку на тело, не завершенное Будущее (это происходит в a.start()), поэтому он не будет собирать мусор до завершения.

object Futures { 

    /** Arranges for the asynchronous execution of `body`, 
    * returning a future representing the result. 
    * 
    * @param body the computation to be carried out asynchronously 
    * @return  the future representing the result of the 
    *    computation 
    */ 
    def future[T](body: => T): Future[T] = { 
    val c = new Channel[T](Actor.self(DaemonScheduler)) 
    val a = new FutureActor[T](_.set(body), c) 
    a.start() 
    a 
    } 
} 
Смежные вопросы