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).

usuario1809295
fuente
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:

public class MyRunnableTask implements Runnable {
     public void run() {
         // do stuff here
     }
}

Y luego úsalo así:

Thread t = new Thread(new MyRunnableTask());
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 = new Thread(new Runnable() {
    public void run() {
        // stuff here
    }
});
t.start();

Esto es similar a lo anterior, solo que no crea otra clase con nombre.

opatut
fuente
68
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í:

interface Runnable {
    public void 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 .

Alex Coleman
fuente
¿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.
Stephen C