Applet und Abbrechen von rechenintensiven Berechnungen

  • Schreibe gerade ein Applet,welches auf max 10.000.000 Datensätze eine Berechnung ausführt, die ziemlich rechenintensiv ist und somit sehr viel Zeit in Anspruch nimmt.

    Wie kann ich die Berechnung abbrechen?

    Habe die Klasse als Thread implementiert, aber ein Beenden durch Thread.interrupt() oder durch eine eigene Methode Thread.cancel (welche eine Boolean Variable innerhalb der Berechnung setzt) schlagen fehl.
    Wenn ich im Applet ActionListener implementiere und dort die Methode Thread.cancel aufrufe, ist trotzdem die Auslastung so hoch, dass die Methode Thread.cancel nach Click auf Cancel Button erst zum Zuge kommt, wenn eh schon die Berechnung abgeschlossen ist.

    Mit keyListener habe ich auch schon experimentiert, aber ohne Erfolg. Ein Abbrechen mittels ESC oder aehnlichem wird erst nach der Berechnung wahr genommen.

    Wäre eine Möglichkeit, den Thread hin und wieder in eine Warteschleife zu stellen?(Gefällt mir nicht sonderlich, da die Berechnung ja noch länger dauern würde).

    Irgendwelche Ideen?

    thx


  • Zitat

    Original geschrieben von Becherer
    [...]ein Beenden durch Thread.interrupt() oder durch eine eigene Methode Thread.cancel (welche eine Boolean Variable innerhalb der Berechnung setzt) schlagen fehl.
    <snip/>
    Irgendwelche Ideen?


    deinThread.setPriority(Thread.MIN_PRIORITY);
    am besten noch vor deinThread.start(), da du sonst möglicherweise dasselbe Problem mit Auslastung hast wie bei deiner cancel Methode. Wenns dann nicht geht passt bei deiner cancel Methode was nicht...
    Eine andere Möglichkeit wäre, hin und wieder Thread.yield() aufzurufen, würde dir aber prinzipiell davon abraten; außer es gibt Stellen in deinem Code/Algorithmus, von denen du weißt, dass sie nicht oft, d.i. nicht bei jedem Schlefendurchlauf aufgerufen werden, aber doch regelmäßig - wird wohl eher nicht der Fall sein.
    Erfahrungsgemäß würde ich Threads in GUI Programmen _immer_ MIN_PRIORITY zuweisen, da sonst meistens nicht nur die JVM sondern auch das restliche OS mehr oder weniger `steht' :borg:

    hth

    EDIT: Schau dir mal die JavaDocs für Thread.interrupt() an dann wirst du sehen, dass es unmöglich das sein kann wonach du gesucht hast. Es `weckt' nämlich schlafende oder wartende Threads auf (und der Code für das abfangen der zugehörigen InterruptedException wird ausgefürht)

    I invented ctrl-alt-del but Bill [Gates] made it famous
    Dave Bradly, IBM PC designer

  • Mit der Methode interrupt() wird in dem Thread ein internes
    natives Flag gesetzt, welches dann in der run() Methode durch isInterrupted() periodisch abgefragt werden kann.
    Somit kann ich an bestimmten Stellen den Thread gezielt beenden. Soweit die Theorie.

    Versuchs jetzt mal mit Thread.MIN_PRIORITY.
    Mal sehen, wie weit mich das bringt.
    thx


  • Zitat

    Original geschrieben von Becherer
    Mit der Methode interrupt() wird in dem Thread ein internes
    natives Flag gesetzt, welches dann in der run() Methode durch isInterrupted() periodisch abgefragt werden kann.


    Stimmt, nur hab ich noch nie gesehen das jemand das macht. Die Methode interrupt() ist wie gesagt hauptsächlich dazu da, Threds die eigentlich gerade schlafen oder blocken aus diesem Zustand zu holen.

    Es ist auch nicht effektiv: Du kannst ja dein eigenes Flag erstellen, das du setzt und abfragst. Bei so trivialen Sachen ist der Overhead den du durch den Aufruf einer nativen Methode hast viel größer als jeder Performance Gewinn (wäre bei true/flase Abfragen überhaupt einer da?). Außerdem wird ja bei interrupt() noch ein Security Check gemacht und bei Applets sollte normalerweise ein SecurityManger aktiv sein. Die Frage ist also ob du dazu überhaupt berechtigt bist

    I invented ctrl-alt-del but Bill [Gates] made it famous
    Dave Bradly, IBM PC designer

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!