Frage

Ich versuche, meinen Haupt-Thread Laich aus einem neuen Thread zu haben, und nach einiger Zeit, erhöhe den Interrupt-Flag. Wenn es so tut, sollte der erzeugte Thread die Flagge sehen und selbst beenden.

Der Haupt-Thread sieht in etwa wie folgt aus:

final Thread t = new Thread()
{
    @Override
    public void run()
    {
        f();
    }
};
t.start();
try
{
    t.join(time);
    t.interrupt();
    if(t.isAlive())
    {
        t.join(allowance);
        if(t.isAlive())
            throw new Exception();
    }
}
catch(Exception e)
{
    System.err.println("f did not terminate in the alloted time");
}

Und der erzeugte Thread hat ein Bündel der während seiner gesamten Code verstreut folgende:

if(Thread.interrupted()) return;

Wenn ich im Debug-Modus bin, alles funktioniert perfekt. Das Interrupt-Flag wird von dem Haupt-Thread angehoben und wird durch die erzeugte Thread gefangen. der erzeugte Thread scheint nicht das Interrupt-Flag zu erhalten, unabhängig davon, wie lange habe ich die Zulage in regulären Betriebsmodus jedoch.

Weiß jemand, was ich falsch mache?

Hinweis: Ich bin mit Ubuntu und ich bin alles zusammen, um neues zu etwas Linux. Kann das Problem mit dem Betriebssystem sein? Ich habe nicht den Code auf einem anderen O getestet.

War es hilfreich?

Lösung

Ich schlage vor, Sie betrachten eine ExecutorService verwendet, die diese Art der Sache zu tun entworfen und können Sie auf andere Weise helfen.

ExecutorService service = Executors.newCachedThreadPool();
Future<ResultType> future = service.submit(new Callable<ResultType() {
   public ResultType call() throws Exception {
      // do soemthing
      return (ResultType) ...;
   }
);
// do anything you like until you need to result.
try {
   ResultType result = future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException timedOut) {
  // handle exception
  // cancel the task, interrupting if still running.
  result.cancel(true);
} catch (ExecutionException taskThrewAnException) {
  // handle exception
}
// when you have finished with the service, which is reusable.
service.shutdown();

Andere Tipps

Hier sind meine Vermutungen:

  • Wenn Haupt-Thread Anrufe t.interrupt(); der t Thread bereits die Ausführung beendet hat.
  • Wenn Haupt-Thread t.interrupt(); im t-Thread es ruft keine Anrufe mehr interrupted() Flagge zu überprüfen.
  • Sie erhalten die Ausnahme als Ergebnis den Code ausgeführt wird? in Ihrem Code erhalten Sie die Ausnahme, die Sie nach dem „allowance“ Zeit werfen oder Sie haben einige andere wie ThreadInterruptedException oder ähnliches? Versuchen Sie, die Nachricht von der abgefangene Ausnahme zu schreiben ...

Haben Sie überprüft von Thread.interrupted verschachtelt ()? Dieses Verfahren löscht das Flag unterbrochen, so dass der zweite Aufruf gibt false. Sie könnten verwenden unterbrochen wird () statt.

Es sieht aus, als ob die Thread.interrupted () -Aufruf in f nicht erreicht wird ().

Das unterschiedliche Verhalten Sie in Debug und Run-Modus sehen, ist wahrscheinlich aufgrund einer Race-Bedingung sein.

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