2012-03-24 8 views
11

Si creo un objeto ejecutablePasando objeto ejecutable único a varios constructores de rosca

Runnable run = new MyRunnable(); 

y luego pasar el mismo objeto exacto a dos constructores de rosca y ejecutarlos

new Thread(run).start; 
new Thread(run).start; 
  1. es la posible ? ¿Cuáles son las implicaciones?
  2. Si llamo a Thread.sleep (0); en la clase MyRunnable, ¿ambos subprocesos duermen porque son el mismo objeto o la entidad hilo está completamente separada del objeto?
  3. ¿Habrá alguna vez una razón para hacer esto, si no, responda las dos preguntas anteriores, porque no creo que entienda completamente el mecanismo de la secuencia todavía?
+4

¿Por qué no lo prueba usted mismo y lo ve? –

+2

Tratar de discernir qué está pasando con el hilo, solo a través de las pruebas, a veces puede tener resultados no concluyentes debido a la forma en que están los hilos. No quiero irme, en este caso, la solidez de mi programa al azar. – rubixibuc

Respuesta

10
  1. es definitivamente posible y legal. Si su Runnable no tiene estado (no hay campos), todo estará bien. Si su Runnable tiene un estado mutable, entonces puede necesitar usar uno de los muchos mecanismos de exclusión mutua de Java como ReentrantLock o la palabra clave synchronized. Porque ambos subprocesos mutarán los campos del mismo objeto Runnable.

  2. No, creó y ejecutó dos subprocesos diferentes. Simplemente llaman al Runnable.run().

  3. No está fuera de lo posible. Ni siquiera diría que es necesariamente una mala práctica. situaciones específicas en las que es posible hacer esto deja como ejercicio para el lector ...

+0

3. Un uso: tener un componente singleton de resorte como ejecutable. –

7

1) es la posible? ¿Cuáles son las implicaciones?

Sí es posible.

La implicación es que cualquier estado en el Runnable es (potencialmente) compartido por todos los hilos, y el acceso a/actualización de ese estado debe sincronizarse correctamente.

2) Si llamo a Thread.sleep (0); en la clase MyRunnable, ¿ambos subprocesos duermen porque son el mismo objeto o la entidad hilo está completamente separada del objeto?

No, no lo harán.

El subproceso es lógicamente distinto del Runnable. Llamar al Thread.sleep() no afecta directamente al Runnable y a otros hilos que puedan estar compartiéndolo. (Podría efectuar otros hilos indirectamente; por ejemplo, si un hilo duerme mientras se está llevando a cabo la cerradura primitiva del Ejecutable, y los otros hilos necesita adquirir el bloqueo de progresar.)

3) ¿Habría alguna vez una razón para hacer esto, si no es así, por favor, responda las dos preguntas anteriores, porque no creo que entienda completamente el mecanismo de subprocesos todavía.

Usted poder hacer esto si no hay un estado-hilo específico asociado con el Runnable y que quería reducir al mínimo los gastos generales espacio, o los gastos generales de la inicialización del Runnable. Pero tales casos de uso son raros en la práctica.

En la gran mayoría de los casos de uso del mundo real, cada subproceso necesita una instancia distinta Runnable.

Cuestiones relacionadas