2012-06-13 11 views
7

digo que hago lo siguiente ...Java: ¿Qué sucede si un Runnable que se está utilizando en un hilo se establece en nulo?

// MyRunnable es una clase que he declarado, que implementa Runnable.

MyRunnable r = new MyRunnable(); 
Thread t = new Thread(r); 
t.start(); 

r = null; 

¿Cuáles son las implicaciones de configurar r como nulo en el fragmento de código anterior?

+0

+1 Eche un vistazo a mi respuesta a continuación :) –

+0

@ Eng.Fouad Brilliant :) ¡Muchas gracias! –

+0

De nada. Además, eche un vistazo a mi respuesta aquí: http://stackoverflow.com/questions/9404625/java-pass-by-reference/9404727#9404727 –

Respuesta

7

Voy a explicar esto a usted a través de figuras:

1- En

MyRunnable r = new MyRunnable(); 

va a crear nueva instancia de la clase que en su mayoría MyRunnable implementa la interfaz Runnable:

enter image description here

2- En

Thread t = new Thread(r); 

está creando un nuevo hilo y pasando por valor el objeto de que la r de referencia está apuntando a:

enter image description here

3- En

r = null; 

va a extraer la enlace entre la referencia r y el objeto MyRunnable, que el subproceso t está utilizando para ejecutar el subproceso:

enter image description here

6

Sin implicaciones.

El subproceso ya ha comenzado. Y a pesar de ello, el objeto de subproceso se mantendrá en la referencia por lo que no se recogerá la basura hasta que t lo haga.

+1

Sin implicaciones, incluso si el subproceso aún no se ha iniciado, porque el subproceso en sí tiene un identificador en Runnable también ... – brimborium

+0

@brimborium True. Lo aclararé – Jivings

3

Nada.

La variable r es no el objeto MyRunnable sí mismo; es simplemente una referencia a ese objeto dentro de su bloque de código.

Inicialmente crea un nuevo objeto MyRunnable. Y luego, le "da el nombre"/lo asigna a la variable r. Luego, pásalo al constructor Thread (usando la variable para describir de qué objeto estás hablando). Dentro de ese constructor, casi seguramente se asignará a otras referencias (en el JDK que estoy usando, es un campo llamado target).

Más tarde, vuelva a marcar su referencia r en otro objeto, en este caso, el objeto null. Esto no tiene ningún efecto en el objeto que solía apuntar, solo la referencia. Asimismo, no tiene ningún efecto sobre otras referencias que apuntan al mismo objeto.

Así que la referencia Thread.target aún apunta al mismo objeto MyRunnable que usted creó inicialmente, y desde el punto de vista del hilo, nada ha cambiado.

La única diferencia potencial es que su fragmento de código (externo) ya no tiene una referencia al objeto que creó. Entonces, el código que sigue no podrá invocar ningún método en ese objeto, ni pasarlo como un argumento de método, etc. (Esto no debería ser un problema, o sorprendente, dado que deliberadamente anuló su única referencia a ese objeto.)


Si nada contiene una referencia a un objeto en particular, entonces el recolector de basura en su próxima ejecución considerar ese objeto inalcanzable, y recogerlo. Sin embargo, esto rara vez es algo de lo que deba preocuparse, ya que si no tiene una referencia al objeto, no podrá hacer nada con él de todos modos (todo el principio detrás de GC).

En este caso, el MyRunnable no será GCed porque el Thread todavía contiene una referencia al mismo.

Dicho esto, si el constructor se comportara de manera diferente y no almacenar una referencia, ya que no necesitaba una (tal vez sólo utiliza la representación toString()), entonces el objeto se considera inalcanzable, y sería ser recogida .En ambos casos, el recolector de basura haría lo correcto, recogiendo un objeto si y solo si nada se refiere a él más, sin que tengas que preocuparte o saber eso en tu código.

Cuestiones relacionadas