2014-01-14 11 views
5

Ich habe ein Programm, das dieses Problem gleichzeitig und ich habe läuft, wo ich den Thread stoppen will, aber die for-Schleife/while-Schleife nicht einmal ich, dass ichFür und While-Schleife

Wenn ich einmal bekommen abgesagt gelangt klicken Nehmen Sie die for Schleife aus der while Schleife, reagiert das Programm tatsächlich auf die Eingabe und schaltet sich ab.

class MyNumber extends Thread { 

    private volatile boolean processing = true; 

    public void run() { 
     while (processing) { 
      // Once I take this for loop out(put // beside it like right now), the enter key to stop the program then does work. 
      //for(int i = 1; i<27; i++){ 
      System.out.println("Letter " + "i"); 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      // } 
     } 
    } 

    public void permSleep() { 
     processing = false; 
    } 
} 

public class LetterNumber { 
    public static void main(String[] args) { 
     MyNumber num1 = new MyNumber(); 
     num1.start(); 

     System.out.println("Hit enter to stop the Numbers!"); 
     Scanner shutter1 = new Scanner(System.in); 
     shutter1.nextLine(); 

     num1.permSleep(); 
    } 
} 

Warum die for Schleife verursachen, das Programm zu nicht Abschaltung?

+0

Btw, sollte es nicht sagen während (Verarbeitung == wahr), aber gerade während (Bearbeitung). Würde die while-Schleife auch nicht brechen, wenn in der Konsole etwas eingegeben wurde, weil sie die Methode permSleep aufgerufen hat, die die Variable verarbeitet == false? – JavaNewb

+0

Das wird "Letter i" einmal pro Sekunde auf unbestimmte Zeit drucken. –

Antwort

2

Ich bin nicht wirklich klar was Sie fragen. Wenn Sie jedoch erwarten, dass die Schleifen while und for beide beendet werden, sobald processing auf true festgelegt ist, passiert das nicht. A while wird die Anweisung in dem Körper (d.h. der for loop) auszuführen, dann sie die Bedingung testen (processing == true), dann, wenn es wahr ist, führt sie die Anweisung wieder, und dann wieder den Zustand prüft. Es wird nicht getestet, während die for Schleife ausgeführt wird. Es "merkt" nicht, wenn die Variable processing gesetzt ist. Wenn also processing auf true eingestellt ist, wird die for-Schleife weiterlaufen, bis sie fertig ist, was weitere 26 Sekunden dauern könnte.

dies einfach zu beheben, fügen Sie

if (!processing) 
    break; 

innerhalb der for Schleife. Jetzt wird das processing Flag jedes Mal durch die for Schleife getestet. (Wenn es nach mir ginge, würde ich ein „Label“ auf der while Schleife setzen und verwenden, die auf break aus beiden Schleifen.) Eine andere Möglichkeit, es zu beheben:

for(int i = 1; i<27 && processing; i++){ 

was bedeutet, dass die for Schleife nur fortgesetzt solange processingtrue ist.

Hinweis: Diese Lösungen werden immer noch nicht processing testen, während die sleep(1000) läuft. So kann das Programm noch bis zu 1 Sekunde pausieren, bevor es beendet wird. Wenn Sie wirklich eine Lösung möchten, die sleep beendet, werden Sie interrupt oder eine andere Nebenläufigkeitsfunktion verwenden.

+2

Meinst du nicht 'if (! Processing)'? –

+0

ja, danke .... – ajb

+0

Really erklärte es gründlich und es behob das Problem.Dank einem Haufen @HotLicks erkannte ich, dass auch und gerade setzen (Verarbeitung == false) – JavaNewb

1

Es sollte funktionieren. Ihre for Schleife dauert ungefähr 27 Sekunden, um zu beenden. Es sollte daraus kommen, nachdem die for Schleife beendet ist.

+2

Yeah die For-Schleife funktioniert gut, es ist nur, dass, sobald ich Enter drücken und es in die Konsole eingeben, hört der Thread nicht auf, wie es sollte. Ich habe versucht, die for-Schleife herauszunehmen und bemerke, dass der Thread nun bei der Eingabe von 'Enter' stoppt. – JavaNewb

+0

Haben Sie eine Weile gewartet? – fastcodejava

Verwandte Themen