16 Stimmen

Wie viele Möglichkeiten gibt es, um in Java einen neuen Thread zu erstellen?

Eigentlich, welche anderen Möglichkeiten gibt es neben dem Erweitern der Thread-Klasse und der Implementierung des Runnable-Interfaces?

3 Stimmen

Es ist keine gute Herangehensweise, die Thread-Klasse zu erweitern! Verwenden Sie immer die letztere.

0 Stimmen

Das ist im Grunde genommen alles. Es gibt andere Möglichkeiten, Runnables auszuführen, wie ThreadPoolExecutor usw., aber sie erfordern alle die Implementierung des Runnable-Interfaces.

36voto

Joachim Sauer Punkte 290477

Es gibt genau eine Möglichkeit, einen neuen Thread in Java zu erstellen, und das ist, eine Instanz von java.lang.Thread zu instantiieren (um diesen Thread tatsächlich auszuführen, müssen Sie auch start() aufrufen).

Alles andere, was Threads in Java-Code erstellt, greift hinter dem Deckmantel auf diese eine Methode zurück (z.B. wird eine Implementierung einer ThreadFactory zu einem bestimmten Zeitpunkt Thread-Objekte instanzieren, ...).

Es gibt zwei verschiedene Möglichkeiten, anzugeben, welcher Code ausgeführt werden soll in dem Thread:

Der erste Ansatz (Implementierung von Runnable) wird normalerweise als der korrektere Ansatz angesehen, weil Sie normalerweise keinen neuen "Typ" von Thread erstellen, sondern einfach nur etwas Code (d.h. ein Runnable) in einem dedizierten Thread ausführen möchten.

0 Stimmen

Ich bin überrascht, dass sie Thread#run() bisher nicht veraltet haben. Sie sollten es wirklich tun. Die Idee, dass ein Thread ist ein Runnable ist sehr altmodisch und im Vergleich zur Idee, dass ein Thread hat ein Runnable relativ einschränkend. Das gleiche gilt auch für andere Klassen: "hat ein" ist oft mächtiger als "ist ein".

1 Stimmen

@Joachim Sauer - was ist mit callable? Fällt es auch auf die Instanziierung der Thread-Klasse zurück?

1 Stimmen

@SantanuSahoo: Callable ist ziemlich ähnlich zu Runnable in dem Sinne, dass es an sich nichts mit Threads zu tun hat, aber auf verschiedene Arten verwendet werden kann, um Code auf irgendeine Weise zu übergeben, einschließlich in einem anderen Thread auszuführen. Wenn Sie also ein Callable an Ihren ExecutorService übergeben, wird es möglicherweise sehr gut auf einem neuen Thread ausgeführt, aber die tatsächliche Instanziierung des Threads erfolgt immer noch irgendwo im Hintergrund über new Thread.

26voto

ankit249 Punkte 452

Threads können hauptsächlich auf 3 verschiedene Arten erstellt werden

  1. Erweitern Sie die java.lang.Thread-Klasse

    class SampleThread extends Thread {

    // Methode, in der die Thread-Ausführung beginnt
    public void run(){
        // Logik, die in einem Thread ausgeführt werden soll
    }
    
    // Schauen wir uns an, wie man Threads startet
    public static void main(String[] args){
       Thread t1 = new SampleThread();
       Thread t2 = new SampleThread();
       t1.start();  // starte den ersten Thread. Dies ruft die run() Methode auf.
       t2.start(); // Dies startet den 2. Thread. Dies ruft die run() Methode auf.
    }

    }

  2. Implementieren Sie das java.lang.Runnable-Interface

    class A implements Runnable{

    @Override
    public void run() {
    
        // Führen Sie die run-Methode hier aus
    }
    
    public static void main() {
        final A obj = new A();
    
        Thread t1 = new Thread(new A());
    
        t1.start();
    }

    }

  3. Implementieren Sie das java.util.concurrent.Callable-Interface

    class Counter implements Callable {

    private static final int THREAD_POOL_SIZE = 2;
    
    // Methode, in der die Thread-Ausführung stattfindet
    public String call() {
        return Thread.currentThread().getName() + " wird ausgeführt ...";
    }
    
    public static void main(String[] args) throws InterruptedException,
            ExecutionException {
        // Erstellen Sie einen Pool von 2 Threads
        ExecutorService executor = Executors
                .newFixedThreadPool(THREAD_POOL_SIZE);
    
        Future future1 = executor.submit(new Counter());
        Future future2 = executor.submit(new Counter());
    
        System.out.println(Thread.currentThread().getName() + " wird ausgeführt ...");
    
        // Holen Sie sich asynchron von den Worker-Threads
        System.out.println(future1.get());
        System.out.println(future2.get());
    
    }

    }

Bevorzugen Sie das Callable-Interface mit dem Executor-Framework für Thread-Pooling.

Das Runnable- oder Callable-Interface wird gegenüber der Erweiterung der Thread-Klasse bevorzugt

0 Stimmen

Denken Sie daran, dass Sie in der Eventualität einer Erweiterung die Methode überschreiben müssen, nicht jedoch wenn Sie ein Interface, Runnable implementieren.

5voto

Dimitri Punkte 7818

Oder Sie können ein Callable erstellen, das eine Schnittstelle ist, die ähnlich wie Runnable ist, mit der Ausnahme, dass sie eine Methode call definiert, die einen Wert zurückgeben kann. Um ein Callable zu instanziieren, können Sie es einem Executor übergeben. Sie finden eine ausführliche Erklärung von Multithreading und Callable-Beispielen hier

0 Stimmen

Um ein Callable zu instanziieren, verwenden Sie den Java-"new"-Operator, genauso wie Sie jedes andere Objekt instanziieren. Um ein Callable zu verwenden, rufen Sie entweder seine Methode "Call()" auf oder übergeben Sie es einem anderen Objekt (z. B. einem ExecutorService), das es zu einem geeigneten zukünftigen Zeitpunkt in einem geeigneten Kontext und möglicherweise in einem geeigneten Thread aufrufen wird.

3voto

Mister Smith Punkte 25957

Der bevorzugte Weg, Threads in Java 6 zu starten, ist die Verwendung von Executors:

    ExecutorService es = Executors.newCachedThreadPool();
    Runnable r = ;
    es.execute(r);

0 Stimmen

Genau genommen ist das der bevorzugte Weg, um Code gleichzeitig auszuführen. Wenn du wirklich einen dedizierten Thread starten möchtest, ist das nicht der richtige Weg.

0 Stimmen

@Joachim Ich denke, es ist in Ordnung, hier Thread zu verwenden. beachten Sie das kleine t im thread. Und diese Ausführenden erstellen und verwalten tatsächlich Threads.

0 Stimmen

@Gray es hat beide Methoden: execute(Runnable) und ein weiteres submit(Callable).

3voto

Shashank K Punkte 162

Es gibt tatsächlich insgesamt 4 Möglichkeiten, einen Thread in Java zu erstellen:

  1. Durch Erweitern der Klasse java.lang.Thread
  2. Durch Implementieren des Interface java.lang.Runnable
  3. Durch Verwendung einer anonymen inneren Klasse
  4. Durch Implementieren des Interface Callable.

0 Stimmen

Das Implementieren von Threads in einer separaten anderen Klasse oder als anonyme Klasse ist nur eine Möglichkeit, sie zu verwenden. Wie oben beschrieben, gibt es nur 3 Möglichkeiten, Threads zu implementieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X