2012-03-22 11 views
5

Cuando diferentes subprocesos tienen acceso a un método estático, ¿los objetos declarados en ese método son locales o compartidos entre subprocesos en Java?Cuando diferentes subprocesos acceden a un método estático, ¿los objetos declarados en ese método son locales o compartidos en Java

Además, ¿es seguro llamar al thread.interrupt() en un hilo que está haciendo E/S?

+3

Esas son dos preguntas separadas y se deben formular en dos publicaciones separadas. – Jeffrey

+0

invocando thread.interrupt en threads haciendo io en un método estático –

+1

todavía dos preguntas separadas. – Jeffrey

Respuesta

8

Los objetos declarados dentro de un método static no se comparten entre subprocesos. Los objetos definidos fuera del método como static se comparten.

Así:

private static Object thisIsShared; 

public static void myMethod() { 
    Object thisIsNotShared = new Object(); 
} 

Si usted va a estar llamando interrupt() en las roscas haciendo E/S que debe buscar en el uso de clases que implementan the InterruptableChannel interface.

1

Las variables declaradas en un método estático NO se comparten entre subprocesos. Cuando un método estático no modifica ningún objeto estático u otro objeto compartido, es seguro para el hilo, lo que significa que varios hilos pueden invocar el método y no pasará nada malo.

Looking here, muchas cosas pueden salir mal al interrumpir un hilo. Pero no parece que tener un hilo invocar un método estático es uno de ellos. Podría estar equivocado.

+0

'static' no tiene nada que ver con eso. – EJP

2

En cuanto a la interrupción() ->

Depende de cómo se va a manejar las interrupciones en el proceso de IO. A pesar de su nombre, interrupt() no hace más que pasar un mensaje de interrupción al hilo dado. No implica dejar de operar lo más rápido posible. El hilo de recepción verá este mensaje y elevará la excepción InterruptedException. Cómo reaccionará ante la situación está en su poder. Puede optar por ignorarlo, reiniciarse, apagar, lo que sea.

Las interrupciones generalmente se usan cuando necesita decirle a otro hilo que algo fundamental ha cambiado y que el contexto actual de ejecución puede que ya no sea válido, deseable o posible o lo que sea que necesite.

1

la respuesta correcta es: estático frente a no estático, no importa.

Las variables locales siempre son locales para esa invocación del método, independientemente de si el método es estático o no. se asignan en la pila y salen de la pila (y no se pueden usar) después de que el método sale.

cuanto a su segunda pregunta, lea la documentación,

http://developer.android.com/reference/java/lang/Thread.html

si está utilizando no bloqueo IO, entonces sí llamar interrupt() puede tener sentido en función de lo que se espera (de nuevo , lee los documentos). si está bloqueando IO, llamar al interrupt() no tendrá ningún efecto.

1

Es seguro llamar thread.interrupt() en un hilo que está haciendo E/S mientras la E/S se está trabajando en un interruptable channel.

Si este hilo está bloqueado en una operación de E/S en un canal interrumpible entonces el canal se cierra, se establecerá de estado de interrupción del hilo, y el hilo recibirá una ClosedByInterruptException.

Según java.lang.Thread

1

Cuando diferentes subprocesos tienen acceso a un método estático, se declaran los objetos en ese método local o compartida entre los hilos en Java?

Los objetos declarados en cualquier método son locales para el método. No hace ninguna diferencia si el método es estático o lo que sea.

1

Las variables declaradas en método estático o no estático no se comparten entre subprocesos diferentes.

Cuestiones relacionadas