Dans une explication simple à comprendre, qu'est-ce que Runnable en Java? [fermé]

92

Qu'est-ce que "exécutable" en Java, en termes simples? Je suis un étudiant en programmation AP au lycée, dont la mission est de faire de la recherche, ou de chercher auprès des autres ce qu'est «exécutable» (nous entrons juste dans la POO, et n'avons pas encore touché aux fils).

user1809295
la source
Il n'y a qu'une seule ligne utile dans la documentation de l'API: "Le contrat général de la méthode exécutée est qu'elle peut entreprendre n'importe quelle action."
Tom Hawtin - tackline
Une tâche de recherche beaucoup plus intéressante aurait été: Qu'est-ce qui est "stoppable" en Java, en termes simples. Todays Instructors are so ...
Udo Klimaschewski
9
@UdoKlimaschewski - le gars est un lycée étudiant, pas un étudiant de premier cycle ou de troisième cycle. Les attentes de cet instructeur sont à la mesure du niveau de l'étudiant ... IMO. Cependant, je suis d'accord que "demander d'abord sur SO" n'est PAS une technique de recherche appropriée pour quelqu'un au niveau du PO.
Stephen C

Réponses:

189

Un Runnable est fondamentalement un type de classe (Runnable est une Interface) qui peut être mis dans un thread, décrivant ce que le thread est censé faire.

L' interface exécutable exige de la classe qu'elle implémente la méthode run()comme suit:

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

Et puis utilisez-le comme ceci:

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

Si vous n'aviez pas l' Runnableinterface, la classe Thread, qui est chargée d'exécuter vos trucs dans l'autre thread, n'aurait pas la promesse de trouver une run()méthode dans votre classe, donc vous pourriez obtenir des erreurs. C'est pourquoi vous devez implémenter l'interface.

Avancé: Type anonyme

Notez que vous n'avez pas besoin de définir une classe comme d'habitude, vous pouvez faire tout cela en ligne:

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

Ceci est similaire à ce qui précède, mais vous ne créez pas une autre classe nommée.

opatut
la source
68
Il s'agit d'une excellente réponse qui réfute entièrement l'allégation selon laquelle la question "ne peut pas recevoir de réponse raisonnable dans sa forme actuelle".
Russell Silva
1
Je sais que cela faisait longtemps mais j'ai une question. Le thread n'est exécuté qu'une seule fois ou continue de fonctionner encore et encore à l'intérieur du programme lorsque je démarre un thread?
gamo
5
Le thread est exécuté jusqu'à ce que la runméthode se termine, puis le thread est fermé. Si vous voulez qu'un thread s'exécute encore et encore, placez une boucle à l'intérieur de la runméthode.
opatut
2
Ou simplement en utilisant une fonction lambda Java 8:new Thread(() -> System.out.println("hello from other thread")).start();
Gabe
9

Runnable est une interface définie comme suit:

interface Runnable {
    public void run();
}

Pour créer une classe qui l'utilise, définissez simplement la classe comme (public) class MyRunnable implements Runnable {

Il peut être utilisé sans même faire un nouveau fil. C'est essentiellement votre interface de base avec une seule méthode, run, qui peut être appelée.

Si vous créez un nouveau Thread avec runnable comme paramètre, il appellera la méthode run dans un nouveau Thread.

Il convient également de noter que Threads implémente Runnable, et cela est appelé lorsque le nouveau Thread est créé (dans le nouveau thread). L'implémentation par défaut appelle simplement le Runnable que vous avez remis au constructeur, c'est pourquoi vous pouvez simplement vous new Thread(someRunnable)passer de la runméthode de Thread .

Alex Coleman
la source
Êtes-vous en train de dire qu'il n'y a fondamentalement aucune différence entre hériter de Thread ou implémenter Runnable? Thread lors de l'utilisation de Runnable est-il utilisé comme wrapper, ainsi que comme exécuteur?
opatut
Je dis qu'il n'y a pas de différence entre [étendre Thread et écraser l'exécution] et [créer une nouvelle instance de Thread avec un exécutable qui a la même méthode d'exécution]
Alex Coleman
Ouais, j'ai ça. Mais n'y a-t-il vraiment aucune différence, ni performance - ni autre?
opatut
3
@AlexColeman - il y a une grande différence. Si vous Threadétendez le pool de threads est difficile et si vous n'implémentez pas le pool de threads, vous portez le coût important de la création de nouveaux threads tout le temps. En revanche, la simple mise en œuvre Runnablesignifie que vous pouvez facilement utiliser des éléments tels que ThreadPoolExecutorServiceou un pool de threads tiers.
Stephen C