Frage

ich eine Funktion 3rd-Party-Modul auf einem neuen Thread aufrufen müssen. Von dem, was ich gesehen habe, schließt der Anruf entweder schnell, wenn alles ging hängt gut oder es nur immer den Faden aufzuhängen. Was ist ein guter Weg, um den Thread zu starten und den Anruf zu tätigen und für ein paar Sekunden warten, und wenn der Faden noch am Leben ist, dann sind vorausgesetzt, sie eingesperrt, kill (oder Anschlag oder verlassen) den Faden ohne veraltete Methoden zu verwenden.

Ich habe so etwas wie dies für jetzt, aber ich bin mir nicht sicher, ob dies der beste Weg, es zu tun ist, und ich möchte, rief Thread.stop () vermeiden, da es veraltet ist. Danke.

private void foo() throws Exception
{
        Runnable runnable = new Runnable()
        {

            @Override
            public void run()
            {
                    // stuff that could potentially lock up the thread.
            }
        };
        Thread thread;
        thread = new Thread(runnable);
        thread.start();
        thread.join(3500);
        if (thread.isAlive())
        {
            thread.stop();
            throw new Exception();
        }

}
War es hilfreich?

Lösung

public void stop() {
        if (thread != null) {
           thread.interrupt();
        }
    }

Siehe diesen Link auf, wie man einen Thread zu stoppen, deckt sie das Thema gut

Andere Tipps

Es gibt keine Möglichkeit zu tun, was Sie wollen (unbedingt). Zum Beispiel, wenn die stuff that could potentially lock up the thread. wie folgt aussieht, gibt es keine Möglichkeit, ihn zu stoppen, immer kurz System.exit ():

public void badStuff() {
 while (true) {
  try {
   wait();
  }
  catch (InterruptedException irex) {
  }
 }
}

Wenn Ihre App stecken bleibt, führen jstack (oder den Debugger verwenden). Versuchen Sie herauszufinden, was die Funktion klebt und beheben.

Ich würde die java.util.concurrent Executor Rahmen schauen und speziell die Future<T> Schnittstelle. Mit diesen werden Sie etwas von den Launen der java.lang.Thread abstrahiert, und Sie gute Entkopplung von dem, was die Aufgaben aus, wie sie ausgeführt werden (ob auf einem separaten Thread, ob der Faden aus einem Pool kommt oder auf dem instanziiert Fliege, etc.)

Eine Zukunft Instanz zumindest gibt Ihnen isDone und isCancelled Methoden.

Die ExecutorService (Subschnittstelle von Executor) gibt Ihnen einige Mittel zur Schließung keine Inanspruchnahmen Aufgaben nach unten. Oder überprüfen Sie das ExecutorService.awaitTermination(long timeout, TimeUnit unit) Verfahren

private void foo() throws Exception
{
        ExecutorService es = Executors.newFixedThreadPool(1);

        Runnable runnable = new Runnable()
        {

            @Override
            public void run()
            {
                    // stuff that could potentially lock up the thread.
            }
        };

        Future result = es.submit(runnable);

        es.awaitTermination(30, TimeUnit.SECONDS);

        if (!result.isDone()){
            es.shutdownNow();
        }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top