web-dev-qa-db-fra.com

Comment démarrer une classe de thread anonyme

J'ai l'extrait de code suivant:

public class A {
    public static void main(String[] arg) {
        new Thread() {
            public void run() {
                System.out.println("blah");
            }
        };
    }
}

Ici, comment appeler la méthode start() pour le thread sans créer d'instance de la classe de thread?

59
noMAD

Vous créez déjà une instance de la classe Thread - vous ne faites rien avec elle. Vous pourriez appeler start() sans même utiliser de variable locale:

new Thread()
{
    public void run() {
        System.out.println("blah");
    }
}.start();

... mais personnellement, je l'assignerais normalement à une variable locale, ferais tout ce que vous voudriez (par exemple, définissez le nom, etc.), puis démarrez-le:

Thread t = new Thread() {
    public void run() {
        System.out.println("blah");
    }
};
t.start();
137
Jon Skeet

Comme les classes anonymes étendent la classe donnée, vous pouvez les stocker dans une variable.

par exemple.

Thread t = new Thread()
{
    public void run() {
        System.out.println("blah");
    }
};
t.start();

Alternativement, vous pouvez simplement appeler la méthode de démarrage sur l'objet que vous avez immédiatement créé.

new Thread()
{
    public void run() {
        System.out.println("blah");
    }
}.start();
// similar to new Thread().start();

Bien que personnellement, je conseillerais toujours de créer une instance anonyme de Runnable plutôt que de Thread, car le compilateur vous avertira si vous obtenez accidentellement la signature de la méthode incorrecte (pour une classe anonyme, il vous avertira de toute façon, car les classes anonymes ne peuvent pas définir nouvelles méthodes non privées).

par exemple

new Thread(new Runnable()
{
    @Override
    public void run() {
        System.out.println("blah");
    }
}).start();
14
Dunes

Vous ne savez pas exactement ce que vous demandez, mais vous pouvez faire quelque chose comme:

new Thread() {
    public void run() {
        System.out.println("blah");
    }
}.start();

Notez la méthode start() à la fin de la classe anonyme. Vous créez l'objet thread mais vous devez le démarrer pour obtenir un autre thread en cours d'exécution.

Mieux que créer une classe Thread anonyme, c’est créer une classe Runnable anonyme:

new Thread(new Runnable() {
    public void run() {
        System.out.println("blah");
    }
}).start();

Au lieu de remplacer la méthode run() dans Thread, vous injectez une cible Runnable à exécuter par le nouveau thread. C'est un meilleur modèle.

6
Gray

Il suffit d'appeler start ()

new Thread()
{
    public void run() {
        System.out.println("blah");
    }
}.start();
3
Jeremiah Orr

La totalité de l'expression new est une référence à un objet; vous pouvez donc y invoquer des méthodes:

public class A {
    public static void main(String[] arg)
    {
        new Thread()
        {
            public void run() {
                System.out.println("blah");
            }
        }.start();
    }
}
3
Dave Costa

Ajouter: vous pouvez maintenant utiliser lambda pour simplifier votre syntaxe. Condition requise: Java 8+

public class A {
    public static void main(String[] arg)
    {
        Thread th = new Thread(() -> {System.out.println("blah");});
        th.start();
    }
}
2
recolic

Je suis surpris de ne voir aucune mention du framework Executor de Java pour les réponses à cette question. L'un des principaux arguments de vente du framework Executor est de ne pas avoir à traiter avec les threads de bas niveau. Au lieu de cela, vous avez affaire au niveau d'abstraction supérieur de ExecutorService s. Ainsi, au lieu de démarrer manuellement un thread, exécutez simplement l'exécuteur qui encapsule un Runnable. À l'aide de l'exécuteur de threads, l'instance Runnable que vous créez sera encapsulée en interne et exécutée en tant que thread.

import Java.util.concurrent.ExecutorService;
import Java.util.concurrent.Executors;
// ...

ExecutorService threadExecutor = Executors.newSingleThreadExecutor();
try {
  threadExecutor.execute(
    new Runnable() {
      @Override
      public void run() {
        System.out.println("blah");
      }
    }
  );
} finally {
    threadExecutor.shutdownNow();
}

Pour plus de commodité, voir le code sur JDoodle .

0
entpnerd

Laissons ceci ici pour référence future, mais c’est aussi une réponse.

new Thread (() -> peu importe ()). start ();

0
Kristoff