¿Cuándo llamarías a Java en thread.run()
lugar de thread.start()
?
java
multithreading
concurrency
blanco
fuente
fuente
t.run()
cuando quiere ejecutart
la tarea en el hilo actual, yt.start()
cuando quiere ejecutart
la tarea en el hilot
mismo. ¿O está preguntando por casos de uso reales?start()
! Como yo ... ¡Este método no debería ser público!Respuestas:
Es posible que desee llamar a run () en una prueba unitaria particular que se refiera estrictamente a la funcionalidad y no a la concurrencia.
fuente
Nunca. Llamar a run () directamente solo ejecuta el código sincrónicamente (en el mismo hilo), como una llamada a un método normal.
fuente
Tomado de las preguntas frecuentes sobre hilos de Java de estilo de código :
fuente
thread's run() method executes the run() method of the Runnable object in the new thread instead.
Eso no es cierto (o al menos mi código fuente de Java 8 dice lo contrario), pero desafortunadamente el enlace parece roto, así que informo el error aquí.thread.run()
lugar dethread.start()
.La ejecución
thread.run()
no crea una nuevaThread
en la que se ejecuta su código. Simplemente ejecuta el código en el Thread actual desde el quethread.run()
se invoca el código.La ejecución
thread.start()
crea un nuevo hilo de nivel de sistema operativo en elrun()
que se llama al método.En esencia:
Además, como han mencionado otros, "probar" parece ser el único caso aconsejable en el que puede invocar
run()
directamente desde su código.fuente
Ya se ha aludido a esto, pero para que quede claro: crear un nuevo objeto Thread solo para llamar a su método run () es innecesariamente caro y debería ser una señal de alerta importante. Sería un diseño mucho mejor y más desacoplado crear un impl Runnable y (a) llamar a su método run () directamente si ese es el comportamiento deseado, o (b) construir un nuevo Thread con ese Runnable e iniciar el Thread.
Mejor aún, para un desacoplamiento aún mayor, consulte la
Executor
interfaz y el marco en JDK 5 y versiones posteriores. Esto le permite, en pocas palabras, desacoplar la ejecución de la tarea (la instancia Runnable) de cómo se ejecuta (la implementación Executor, que podría ejecutar el Runnable en el Thread actual, en un Thread nuevo, utilizando un Thread existente de un grupo, Y qué no).fuente
Llame
thread.start()
, a su vez llamaráthread.run()
. No puedo pensar en un caso en el que quiera omitirthread.start()
e ir directamente athread.run()
fuente
Los métodos separados
start()
yrun()
de la clase Thread proporcionan dos formas de crear programas con subprocesos. Elstart()
método inicia la ejecución del nuevo hilo y llama alrun()
método. Elstart()
método regresa inmediatamente y el nuevo hilo normalmente continúa hastarun()
que regresa el método.El
run()
método de la clase Thread no hace nada, por lo que las subclases deben anular el método con código para ejecutar en el segundo hilo. Si se crea una instancia de un hilo con un argumento Runnable, elrun()
método del hilo ejecuta elrun()
método del objeto Runnable en el nuevo hilo.Dependiendo de la naturaleza de su programa enhebrado, llamar al
run()
método Thread directamente puede dar el mismo resultado que llamar a través delstart()
método, pero en el último caso, el código se ejecuta en un nuevo hilo.referencia
fuente
The start() method returns immediately and the new thread normally continues until the run() method returns.
Sistart()
regresa de inmediato, ¿cómo es querun()
continúa ejecutándose dado que se llamó a sí mismo desdestart()
Si la pregunta era: "¿por qué se llama al método de inicio del hilo en lugar de ejecutar el método directamente?", Entonces he respondido con un código de ejemplo a continuación. Espero que aclare. En el ejemplo siguiente:
fuente
Cuando desee que se ejecute sincrónicamente. Llamar al método de ejecución en realidad no le dará múltiples subprocesos. El método de inicio crea un nuevo hilo que llama al método de ejecución.
fuente
Si desea ejecutar el contenido de run () como lo haría con cualquier otro método. No para iniciar un hilo, por supuesto.
fuente
Suponiendo que conoce el uso del método de inicio y ejecución, es decir, síncrono frente a asíncrono; El método de ejecución se puede utilizar solo para probar la funcionalidad.
Además, en algunas circunstancias, la misma clase de subproceso se puede usar en dos lugares diferentes con requisitos de funcionalidad de sincronización y asincronización al tener dos objetos diferentes con el método de ejecución de uno y el método de inicio de otro invocado.
fuente
Al menos en la JVM 1.6., Hay un poco de verificación y la ejecución se llama de forma nativa:
fuente
Solo una nota a los excelentes comentarios anteriores: a veces escribes un código de múltiples subprocesos que usa el método "start" para ejecutar diferentes subprocesos. Le resultará mucho más fácil si usa "ejecutar" (en lugar de "iniciar) para depurar, ya que hace que el código se ejecute sincrónicamente y depurarlo mucho más fácilmente.
fuente
fuente