2012-04-05 8 views
0

Ich habe einen Thread, der eine Aufgabe wiederholt ausführt und ausführt. Ich habe einen Zähler implementiert, um mir die Iterationen der Aufgabe anzuzeigen, die vom Thread ausgeführt wurden. Hin und wieder sehe ich, dass der Schalter irgendwo hängen bleibt und nicht mehr ansteigt. Ich erhalte keine Fehler oder Ausnahmen. Die Anwendung läuft, aber es sieht so aus, als ob der Thread gestoppt hat, ohne dass ich danach gefragt habe.Thread stoppt unerwünscht

werde ich einige Code fügen Sie den Thread-Ausführung zu zeigen:

Mitteilung der int „c“ - das ist der Zähler für Wiederholungen.

public void check() { 
    Thread check = new Thread() { 
     public void run() { 

      for (;;) { 
       EventQueue.invokeLater(new Runnable() { 
        public void run() { 
         // Update GUI here on EventQueue. 

         try { 
          Task.readTasks(); 
         } catch (InvalidFormatException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 

         if (NoteInfo == null || NoteInfo == "") { 
          btnViewNote.setEnabled(false); 
         } else { 

          btnViewNote.setEnabled(true); 
         } 

         textField.setText(Task.printNextTask); 
         c++; 
         lblCycle.setText("Cycle: " + c); 

        } 
       }); 

       try { 
        Thread.sleep(5000); 
        // Task.initializeIt(); 
       } catch (InterruptedException ie) { 
        break; 
       } 
       if (killcheck) 
        break; 

      } 
     } 
    }; 
    check.start(); 
} 

public static void stopChecking() { 
    killcheck = true; 
    progressBar.setValue(0); 
    textArea.setText(""); 
    textField.setText(""); 
    c = 0; 
    lblCycle.setText("Cycle: " + c); 

} 
+0

würde ich vor der Pause eine print-Anweisung setzen, um zu sehen hat der Thread beendet. Ich werde auch eine Print-Anweisung direkt vor der C++ - Anweisung setzen. Ich werde auch meinen Debugger starten und den Thread anhalten, wenn der Zähler nicht mehr erhöht wird. – Alvin

Antwort

1

Der Prüfthread wird von einem anderen Thread unterbrochen. Drucken Sie den Stack-Trace im Catch-Block und verifizieren Sie ihn.

try {  
     Thread.sleep(5000); 
     // Task.initializeIt(); 
    } catch (InterruptedException ie) {  
      // break;   // just ignore it 
    } 
+2

Ignorieren Sie InterruptedException nie. http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html – artbristol

+0

Das scheint nicht das Problem zu sein, ich habe getan, was Sie sagen, und die Stack-Trace wird nicht gedruckt. – Yosi199

+0

@artbristol: In diesem speziellen Fall dient die Variable 'killCheck' diesem Zweck. +1. –

0

Ich sehe nicht die Definitionen von killcheck oder c aber es ist möglich, dass diese nicht als volatile markiert haben?

Wenn mehrere Threads einen freigegebenen Wert lesen und schreiben, muss eine Art von Synchronisierung durchgeführt werden, andernfalls könnten sie mit veralteten Werten arbeiten. Sie können entweder eine der atomischen Klassen wie AtomicBoolean oder AtomicInteger verwenden, das Schlüsselwort synchronized verwenden oder die Variable als volatile markieren. Alle drei würden es dem Haupt-Thread und dem inneren Thread erlauben, die Änderungen des anderen an den gemeinsamen Feldern zu sehen.

volatile int c; 
volatile boolean killcheck; 

Für die Nachwelt hier, wie Sie die atomaren Klassen verwenden:

final AtomicInteger c = new AtomicInteger(); 
final AtomicBoolean killcheck = new AtomicBoolean(); 
... 
     c.incrementAndGet(); 
... 
     if (killcheck) 
      break; 
... 
     killcheck.set(true); 
... 
     c.set(0); 
Verwandte Themen