423 Stimmen

Wie kann man einen Thread in Java beenden?

Wie tötet man einen java.lang.Thread in Java?

9voto

Anfet Punkte 387

Ich stimme für Thread.stop() .

Zum Beispiel haben Sie eine lang andauernde Operation (wie eine Netzwerkanfrage). Angeblich warten Sie auf eine Antwort, aber das kann dauern und der Benutzer navigiert zu einer anderen Benutzeroberfläche. Dieser wartende Thread ist nun a) nutzlos b) ein potentielles Problem, denn wenn er das Ergebnis erhält, ist es völlig nutzlos und er wird Rückrufe auslösen, die zu einer Reihe von Fehlern führen können.

All das, und er kann eine Antwortverarbeitung durchführen, die CPU-intensiv sein könnte. Und Sie als Entwickler können es nicht einmal stoppen, denn Sie können nicht einfach die if (Thread.currentThread().isInterrupted()) Zeilen im gesamten Code.

Daher ist es seltsam, dass man einen Thread nicht zwangsweise beenden kann.

5voto

Jesse Glick Punkte 23182

Die Frage ist ziemlich vage. Wenn Sie meinten, "wie schreibe ich ein Programm, damit ein Thread aufhört zu laufen, wenn ich es will", dann sollten verschiedene andere Antworten hilfreich sein. Wenn Sie aber meinten: "Ich habe einen Notfall mit einem Server, den ich im Moment nicht neu starten kann, und ich möchte nur, dass ein bestimmter Thread stirbt, komme was wolle", dann brauchen Sie ein Eingriffswerkzeug, das zu Überwachungswerkzeugen wie jstack .

Zu diesem Zweck habe ich jkillthread . Siehe Gebrauchsanweisung.

4voto

Einen Faden abtöten" ist nicht der richtige Ausdruck dafür. Hier ist eine Möglichkeit, wie wir eine geordnete Beendigung/Beendigung des Threads nach Belieben implementieren können:

Runnable, die ich verwendet habe:

class TaskThread implements Runnable {

    boolean shouldStop;

    public TaskThread(boolean shouldStop) {
        this.shouldStop = shouldStop;
    }

    @Override
    public void run() {

        System.out.println("Thread has started");

        while (!shouldStop) {
            // do something
        }

        System.out.println("Thread has ended");

    }

    public void stop() {
        shouldStop = true;
    }

}

Die auslösende Klasse:

public class ThreadStop {

    public static void main(String[] args) {

        System.out.println("Start");

        // Start the thread
        TaskThread task = new TaskThread(false);
        Thread t = new Thread(task);
        t.start();

        // Stop the thread
        task.stop();

        System.out.println("End");

    }

}

3voto

Anand Rajasekar Punkte 827

Es gibt keine Möglichkeit, einen Thread elegant zu beenden.

Sie können versuchen, den Faden zu unterbrechen. Eine gängige Strategie ist die Verwendung einer Giftpille, um den Faden zum Stillstand zu bringen.

public class CancelSupport {
    public static class CommandExecutor implements Runnable {
            private BlockingQueue<String> queue;
            public static final String POISON_PILL  = “stopnow”;
            public CommandExecutor(BlockingQueue<String> queue) {
                    this.queue=queue;
            }
            @Override
            public void run() {
                    boolean stop=false;
                    while(!stop) {
                            try {
                                    String command=queue.take();
                                    if(POISON_PILL.equals(command)) {
                                            stop=true;
                                    } else {
                                            // do command
                                            System.out.println(command);
                                    }
                            } catch (InterruptedException e) {
                                    stop=true;
                            }
                    }
                    System.out.println(“Stopping execution”);
            }

    }

}

BlockingQueue<String> queue=new LinkedBlockingQueue<String>();
Thread t=new Thread(new CommandExecutor(queue));
queue.put(“hello”);
queue.put(“world”);
t.start();
Thread.sleep(1000);
queue.put(“stopnow”);

http://anandsekar.github.io/cancel-support-for-threads/

2voto

Im Allgemeinen beenden, stoppen oder unterbrechen Sie einen Thread nicht (oder prüfen, ob er unterbrochen() ist), sondern lassen ihn auf natürliche Weise enden.

Das ist ganz einfach. Sie können eine beliebige Schleife zusammen mit einer (flüchtigen) booleschen Variable innerhalb der run()-Methode verwenden, um die Aktivität des Threads zu steuern. Sie können auch vom aktiven Thread zum Hauptthread zurückkehren, um ihn zu stoppen.

Auf diese Weise können Sie einen Thread elegant beenden :) .

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