“implements Runnable” vs “extends Thread” en Java

À partir de ce moment que j'ai passé avec les threads en Java, j'ai trouvé ces deux façons d'écrire des threads:

Avec implements Runnable:

public class MyRunnable implements Runnable {
    public void run() {
        //Code
    }
}
//Started with a "new Thread(new MyRunnable()).start()" call

Ou, avec extends Thread:

public class MyThread extends Thread {
    public MyThread() {
        super("MyThread");
    }
    public void run() {
        //Code
    }
}
//Started with a "new MyThread().start()" call

Est-il une différence significative dans ces deux blocs de code ?

  • Merci pour cette question, les réponses éclairci beaucoup d'idées fausses que j'ai eu. J'ai regardé dans la façon correcte de faire les threads Java avant, DONC existé et il y a beaucoup de désinformation/obsolète l'information.
  • il y a une raison, vous pourriez vouloir étendre Thread (mais je ne le recommande pas), vous pouvez gérer préventivement interrupt(). Encore une fois, c'est une idée, il pourrait être utile dans le cas, toutefois je ne le recommande pas.
  • Veuillez voir aussi la réponse, bien expliqué: stackoverflow.com/q/5562720/285594
  • Je suis en train de puzzle ce que vous vouliez dire sur la gestion de l'interruption(). Êtes-vous essayer de remplacer la méthode?
  • oui bob. Java n'est que naturellement pour java.nio.channels.InterruptibleChannel(s), Vous pouvez jeter un oeil à l'impl. de Fil.interrupt(). À l'aide d'un coup de main de la interrupt() de l'appelant est une idée et une approche utile, encore une fois pas recommandé pour les débutants.
  • il y a un autre moyen de le faire, en étendant java.nio.channels.spi.AbstractSelector et remplacer wakeup() mais c'est une façon trop sale pour évaluer le cas 🙂
  • oui.Comme par le code de la classe Thread peut étendre une classe tandis que la classe Thread B cant étendre une autre classe
  • Devrait ressembler à la mise en œuvre d'un Rappel plus fonctionnel maintenant.
  • cela dépend. Rappel que si vous avez besoin d'un rappel. C'est, si le code en cours d'exécution (le Runnable à l'OP) doit exécuter la logique en l'appelant.
  • dois-je laisser le vide? lors de l'utilisation de fonctions-ils aller sur un autre fil?
  • La Composition est préféré au cours de l'Héritage dans la conception orientée Objet
  • Ne pas utiliser de filetage directement, vous devez utiliser ExecutorService, qui peut être raillé pour de meilleurs tests
  • Étendre Fil lorsque vous avez besoin de CHANGER la façon de Fil se comporte. Mettre en œuvre praticable si vous avez besoin de prolonger un thread différent. Si vous avez besoin de partager un objet entre les threads, Praticable est la façon de le faire, que la thread de ne pas l'autoriser. Si aucun des deux cas s'appliquent, Runnable est plus correct sémantiquement parlant, bien que ce dernier point n'est pas très important, quelqu'un pense que vous avez changé le comportement de fil si vous le prolonger alors que vous ne l'êtes pas.

InformationsquelleAutor user65374 | 2009-02-12