En una explicación simple de entender, ¿qué es Runnable en Java? [cerrado]
92
¿Qué es "ejecutable" en Java, en términos sencillos? Soy un estudiante de programación AP en la escuela secundaria, cuya tarea es investigar o buscar de los demás qué es "ejecutable" (recién estamos entrando en OOP y aún no hemos tocado temas).
Solo hay una línea útil en los documentos de la API: "El contrato general de la ejecución del método es que puede realizar cualquier acción".
Tom Hawtin - tackline
Una tarea de investigación mucho más interesante habría sido: ¿Qué es "interrumpible" en Java, en términos sencillos? Los instructores de hoy son tan ...
Udo Klimaschewski
9
@UdoKlimaschewski: el tipo es un estudiante de secundaria , no un estudiante de pregrado o posgrado. Las expectativas de este instructor son acordes con el nivel del estudiante ... OMI. Sin embargo, estoy de acuerdo en que "preguntar primero sobre el SO" NO es una técnica de investigación adecuada para alguien del nivel del OP.
Stephen C
Respuestas:
189
Un Runnable es básicamente un tipo de clase (Runnable es una interfaz) que se puede poner en un hilo, describiendo lo que se supone que debe hacer el hilo.
La interfaz ejecutable requiere que la clase implemente el método de esta run()manera:
publicclassMyRunnableTaskimplementsRunnable{publicvoid run(){// do stuff here}}
Y luego úsalo así:
Thread t =newThread(newMyRunnableTask());
t.start();
Si no tuviera la Runnableinterfaz, la clase Thread, que es responsable de ejecutar sus cosas en el otro hilo, no tendría la promesa de encontrar un run()método en su clase, por lo que podría obtener errores. Es por eso que necesita implementar la interfaz.
Avanzado: tipo anónimo
Tenga en cuenta que no necesita definir una clase como de costumbre, puede hacer todo eso en línea:
Thread t =newThread(newRunnable(){publicvoid run(){// stuff here}});
t.start();
Esto es similar a lo anterior, solo que no crea otra clase con nombre.
Esta es una gran respuesta que refuta por completo la afirmación de que la pregunta "no puede responderse razonablemente en su forma actual".
Russell Silva
1
Sé que ha pasado mucho tiempo pero tengo una pregunta. ¿El hilo solo se ejecuta una vez o simplemente se sigue ejecutando una y otra vez dentro del programa cuando inicio un hilo?
gamo
5
El hilo se ejecuta hasta runque finaliza el método, luego se cierra el hilo. Si desea que un hilo se repita una y otra vez, coloque un bucle dentro del runmétodo.
opatut
2
O simplemente usando una función lambda de Java 8:new Thread(() -> System.out.println("hello from other thread")).start();
Gabe
9
Runnable es una interfaz definida así:
interfaceRunnable{publicvoid run();}
Para hacer una clase que lo use, simplemente defina la clase como (public) class MyRunnable implements Runnable {
Se puede usar sin siquiera hacer un nuevo hilo. Es básicamente su interfaz básica con un solo método, ejecutar, al que se puede llamar.
Si crea un nuevo hilo con ejecutable como parámetro, llamará al método de ejecución en un nuevo hilo.
También debe tenerse en cuenta que Runnablelos subprocesos se implementan , y se llama cuando se crea el nuevo subproceso (en el nuevo subproceso). La implementación predeterminada simplemente llama a cualquier Runnable que hayas entregado en el constructor, por lo que puedes hacerlo new Thread(someRunnable)sin anular el runmétodo de Thread .
¿Estás diciendo que básicamente no hay diferencia entre heredar Thread o implementar Runnable? ¿Se usa Thread cuando se usa Runnable como envoltorio, así como como ejecutor?
opatut
Estoy diciendo que no hay diferencia entre [extender Thread y anular la ejecución] y [crear una nueva instancia de Thread con un ejecutable que tenga el mismo método de ejecución]
Alex Coleman
Sí, lo tengo. Pero, ¿realmente no hay diferencia, ni de rendimiento ni de otra forma?
opatut
3
@AlexColeman: hay una gran diferencia. Si extiende la Threadagrupación de subprocesos es difícil y si no implementa la agrupación de subprocesos, sufre el costo significativo de crear nuevos subprocesos todo el tiempo. Por el contrario, simplemente implementar Runnablesignifica que puede usar fácilmente cosas como ThreadPoolExecutorServiceo un grupo de subprocesos de terceros.
Respuestas:
Un Runnable es básicamente un tipo de clase (Runnable es una interfaz) que se puede poner en un hilo, describiendo lo que se supone que debe hacer el hilo.
La interfaz ejecutable requiere que la clase implemente el método de esta
run()
manera:Y luego úsalo así:
Si no tuviera la
Runnable
interfaz, la clase Thread, que es responsable de ejecutar sus cosas en el otro hilo, no tendría la promesa de encontrar unrun()
método en su clase, por lo que podría obtener errores. Es por eso que necesita implementar la interfaz.Avanzado: tipo anónimo
Tenga en cuenta que no necesita definir una clase como de costumbre, puede hacer todo eso en línea:
Esto es similar a lo anterior, solo que no crea otra clase con nombre.
fuente
run
que finaliza el método, luego se cierra el hilo. Si desea que un hilo se repita una y otra vez, coloque un bucle dentro delrun
método.new Thread(() -> System.out.println("hello from other thread")).start();
Runnable
es una interfaz definida así:Para hacer una clase que lo use, simplemente defina la clase como
(public) class MyRunnable implements Runnable {
Se puede usar sin siquiera hacer un nuevo hilo. Es básicamente su interfaz básica con un solo método, ejecutar, al que se puede llamar.
Si crea un nuevo hilo con ejecutable como parámetro, llamará al método de ejecución en un nuevo hilo.
También debe tenerse en cuenta que
Runnable
los subprocesos se implementan , y se llama cuando se crea el nuevo subproceso (en el nuevo subproceso). La implementación predeterminada simplemente llama a cualquier Runnable que hayas entregado en el constructor, por lo que puedes hacerlonew Thread(someRunnable)
sin anular elrun
método de Thread .fuente
Thread
agrupación de subprocesos es difícil y si no implementa la agrupación de subprocesos, sufre el costo significativo de crear nuevos subprocesos todo el tiempo. Por el contrario, simplemente implementarRunnable
significa que puede usar fácilmente cosas comoThreadPoolExecutorService
o un grupo de subprocesos de terceros.