Ainsi donc, beaucoup de bonnes Réponses, je tiens à ajouter de plus sur cette, Cela vous aidera à comprendre Extending v/s Implementing Thread_
S'étend lie les deux fichiers de classe de très près et peut causer certains assez difficile de traiter avec code.
Les deux approches font le même travail, mais il y a eu quelques différences.
La plus courante différence est
- Lorsque vous étend la classe Thread, après que vous ne pouvez pas étendre une autre classe dont vous aurez besoin. (Comme vous le savez, Java ne permet pas d'hériter de plus d'une catégorie).
- Lorsque vous implements Runnable, vous pouvez économiser de l'espace pour votre classe d'étendre à toute autre catégorie dans le futur ou présent.
Toutefois, une différence significative entre l'implémentation de Runnable et l'extension de Thread, c'est que
by extending Thread, each of your threads has a unique object associated with it, whereas implementing Runnable, many threads can share the same object instance.
L'exemple suivant permet de comprendre plus clearly_
//Implement Runnable Interface...
class ImplementsRunnable implements Runnable {
private int counter = 0;
public void run() {
counter++;
System.out.println("ImplementsRunnable : Counter : " + counter);
}
}
//Extend Thread class...
class ExtendsThread extends Thread {
private int counter = 0;
public void run() {
counter++;
System.out.println("ExtendsThread : Counter : " + counter);
}
}
//Use above classes here in main to understand the differences more clearly...
public class ThreadVsRunnable {
public static void main(String args[]) throws Exception {
// Multiple threads share the same object.
ImplementsRunnable rc = new ImplementsRunnable();
Thread t1 = new Thread(rc);
t1.start();
Thread.sleep(1000); // Waiting for 1 second before starting next thread
Thread t2 = new Thread(rc);
t2.start();
Thread.sleep(1000); // Waiting for 1 second before starting next thread
Thread t3 = new Thread(rc);
t3.start();
// Creating new instance for every thread access.
ExtendsThread tc1 = new ExtendsThread();
tc1.start();
Thread.sleep(1000); // Waiting for 1 second before starting next thread
ExtendsThread tc2 = new ExtendsThread();
tc2.start();
Thread.sleep(1000); // Waiting for 1 second before starting next thread
ExtendsThread tc3 = new ExtendsThread();
tc3.start();
}
}
Sortie du programme ci-dessus.
ImplementsRunnable : Counter : 1
ImplementsRunnable : Counter : 2
ImplementsRunnable : Counter : 3
ExtendsThread : Counter : 1
ExtendsThread : Counter : 1
ExtendsThread : Counter : 1
Dans l'approche de l'interface Runnable, une seule instance d'une classe est en cours de création et il a été partagé par les différents threads. Si la valeur du compteur est incrémenté pour chaque thread d'accès.
Alors que, de la classe Thread approche, vous devez avoir à créer instance distincte pour chaque thread d'accès. Donc différente de la mémoire est allouée pour chaque classe d'instances et chacune a sa propre compteur, la valeur reste la même, ce qui signifie pas d'incrément va se passer parce que aucun de la référence de l'objet est le même.
Quand utiliser l'Exécutable?
Utilisation de l'interface Runnable lorsque vous souhaitez accéder à la même ressource du groupe de threads. Évitez d'utiliser des classe Thread ici, parce que de multiples objets de la création consomme plus de mémoire et il devient une grosse surcharge de performance.
A class that implements Runnable is not a thread and just a class. For a Runnable to become a Thread, You need to create an instance of Thread and passing itself in as the target.
Dans la plupart des cas, l'interface Runnable doit être utilisé si vous êtes planification pour remplacer la méthode run() et aucun autre Thread méthodes. Ceci est important parce que les classes ne doivent pas être sous-classé, à moins que le programmeur a l'intention de modifier ou d'améliorer le comportement fondamental de la classe.
Lorsqu'il est nécessaire d'étendre une super-classe, l'implémentation de l'interface Runnable est plus appropriée que l'utilisation de la classe Thread. Parce que nous pouvons étendre une autre classe lors de la mise en œuvre de l'interface Runnable de faire un thread.
J'espère que cela va vous aider!