2010-07-12 12 views
13

Supongo que tengo un Stream que es bastante caro de calcular. Puedo crear fácilmente un hilo que "computa por delante" sólo escribir algo así como¿Qué sucede cuando un Scala "Future" es basura recolectada?

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

Si luego tirar la referencia a este Future, será ese hilo se mató por el recolector de basura?

+4

No. El recolector de basura nunca mata los hilos. El cálculo puede tener efectos secundarios que el recolector de basura no puede conocer, en otras palabras, el hilo puede estar haciendo algo importante que el recolector de basura no puede saber, por lo que nunca puede detener el hilo de forma segura. – Jesper

Respuesta

14

No. El hilo pertenece al planificador. En cualquier caso, el programador tiene una referencia al futuro sin terminar del cuerpo (esto ocurre en a.start()), por lo que no será basura recolectada antes de la finalización.

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 
    } 
} 
Cuestiones relacionadas