In una spiegazione semplice da capire, cos'è Runnable in Java? [chiuso]


92

Che cosa è "eseguibile" in Java, in parole povere? Sono uno studente di programmazione AP al liceo, il cui compito è fare ricerche, o cercare da altri cosa sia "eseguibile" (stiamo solo entrando in OOP e non abbiamo ancora toccato le discussioni).


C'è solo una riga utile nei documenti API: "Il contratto generale del metodo eseguito è che può intraprendere qualsiasi azione".
Tom Hawtin - tackline

Un compito di ricerca molto più interessante sarebbe stato: cosa è "bloccabile" in Java, in parole povere. Gli istruttori di oggi sono così ...
Udo Klimaschewski

8
@UdoKlimaschewski - il ragazzo è uno studente delle superiori , non uno studente universitario o post-laurea. Le aspettative di questo istruttore sono commisurate al livello di studente ... IMO. Tuttavia, sono d'accordo che "prima domanda su SO" NON è una tecnica di ricerca adeguata per qualcuno a livello di OP.
Stephen C

Risposte:


188

Un Runnable è fondamentalmente un tipo di classe (Runnable è un'interfaccia) che può essere inserita in un thread, descrivendo ciò che il thread dovrebbe fare.

L' interfaccia eseguibile richiede alla classe di implementare il metodo in questo run()modo:

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

E poi usalo in questo modo:

Thread t = new Thread(new MyRunnableTask());
t.start();

Se non avessi l' Runnableinterfaccia, la classe Thread, che è responsabile di eseguire le tue cose nell'altro thread, non avrebbe la promessa di trovare un run()metodo nella tua classe, quindi potresti ottenere errori. Ecco perché è necessario implementare l'interfaccia.

Avanzate: tipo anonimo

Nota che non è necessario definire una classe come al solito, puoi fare tutto ciò in linea:

Thread t = new Thread(new Runnable() {
    public void run() {
        // stuff here
    }
});
t.start();

Questo è simile al precedente, solo che non crei un'altra classe con nome.


67
Questa è un'ottima risposta che smentisce del tutto l'affermazione che la domanda "non può essere ragionevolmente risolta nella sua forma attuale".
Russell Silva

1
So che è passato molto tempo ma ho una domanda. Il thread viene eseguito solo una volta o continua a scorrere più e più volte all'interno del programma quando avvio un thread?
gamo

5
Il thread viene eseguito fino al termine del runmetodo, quindi il thread viene chiuso. Se vuoi che un thread venga eseguito più e più volte, inserisci un ciclo all'interno del runmetodo.
Opatut

2
O semplicemente usando una funzione lambda Java 8:new Thread(() -> System.out.println("hello from other thread")).start();
Gabe

9

Runnable è un'interfaccia così definita:

interface Runnable {
    public void run();
}

Per creare una classe che la utilizzi, è sufficiente definire la classe come (public) class MyRunnable implements Runnable {

Può essere utilizzato senza nemmeno creare un nuovo filo. È fondamentalmente la tua interfaccia di base con un unico metodo, run, che può essere chiamato.

Se crei un nuovo Thread con runnable come parametro, chiamerà il metodo run in un nuovo Thread.

Va anche notato che i thread implementano Runnablee che viene chiamato quando viene creato il nuovo thread (nel nuovo thread). L'implementazione predefinita chiama semplicemente qualsiasi Runnable che hai consegnato al costruttore, motivo per cui puoi fare a new Thread(someRunnable)meno di sovrascrivere il runmetodo di Thread .


Stai dicendo che praticamente non c'è differenza tra ereditare Thread o implementare Runnable? Thread quando si utilizza Runnable viene utilizzato come wrapper, oltre che come esecutore?
apertura

Sto dicendo che non c'è differenza tra [estendere Thread ed eseguire l'override] e [creare una nuova istanza di Thread con un eseguibile che ha lo stesso metodo di esecuzione]
Alex Coleman

Sì, capito. Ma non c'è davvero differenza, né prestazioni, né altro?
apertura

3
@AlexColeman - c'è una grande differenza. Se si estende il Threadpool di thread è difficile e se non si implementa il pool di thread, si consuma il costo significativo della creazione di nuovi thread tutto il tempo. Al contrario, la semplice implementazione Runnablesignifica che puoi facilmente usare cose come ThreadPoolExecutorServiceo un pool di thread di terze parti.
Stephen C
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.