Προς το περιεχόμενο

Εξοδος απο Infinite Loop (JAVA)


Axelfc

Προτεινόμενες αναρτήσεις

Δημοσ.

Εστω οτι εχω τον παρακατω κωδικα με το infinite loop for(;;). Θελω το loop να εκτελειτε κανονικα και να τερματιζει οταν πατησω απο το πληκτρολογιο το enter. Το προγραμμα ομως συνεχιζει να εκτελειται ενω καταλαβαινει οτι εχω πατησει το enter. Καμια ιδεα για το πως μπορει να γινει αυτο που θελω..; Δεν με πειραζει αμα το loop γινει με for η do-while.

 

>
public class InfiniteLoopExit {

       public static void main(String args[]) {
               for (; {
                       System.out.print("OK");
                       String input = System.in.toString();
                       if ( input.length() == 0 ) break;
               }
	System.out.print("Done");

       }
}

Δημοσ.

Ωραια ερωτηση..εχει καποια καλα σημεια!

 

Λοιπον...ο κωδικας που γραφεις ειναι λαθος...ειδικα το

System.in.toString();

δεν κανει αυτο που νομιζεις. το System.in ειναι ενα ρυακι stream απο πληροφοριες και πρεπει να το διαβαζεις...η τοString δεν κανει αυτο το πραγμα..

αντιθετα η System.in.read διαβαζει απο το stream οπως και να εχει.

 

 

Πριν την Java 1.4 οταν διαβαζες ενα stream η διαδικασια ηταν blocking δηλαδη ... αν εγραφες

int c = System.in.read ()

 

Ηθελες να διαβασεις εναν χαρακτηρα απο το πληκτρολογιο..αν ο χρηστηες δεν παταγε..κατι..τοτε το running thread που το ετρεχες θα ΕΜΕΝΕ για ΠΑΝΤΑ ΕΚΕΙ!

 

αρα εστω και ενα απλο προγραμμα με εναν loop του στυλ διαβασε μεχρι να τελειωσει το stream ..θα κολλουσε εκει αν δεν παταγες τιποτα!

 

while ( (int c=System.in.read)!=-1){

 

}

 

 

αρα το να κανεις κατι τετοιο δηλαδη να κανεισ διαφορα πραγματα ενω περιεμενεις καποια στιγμη ο χρηστης να πατησει Enter με μια μονο διεργασια..Thread οf execution δεν γινοταν!

 

Η λυση ηταν η εξης...

 

Φιαχνεις ενα thread worker το οποιο κανει αυτο που θες να κανει...συνεχεια...

και στο βασικο MAIN thread το ξεκινας..παραλληλα στο βασικο thread παρακολουθεις το πληκτρολογιο...σε μια κατασταση system.in.read

δεν σε πειραζει που θα γινει Block μιας και ο worker σου κανει την δουλεια που θες..ΜΟΛΙΣ ο χρηστης πατησει κατι...το main προσπαθει να σταμτησει τον worker (Interrupt).

 

ελπιζω να σου εδωσα να καταλαβεις..

 

>
/*
* Test.java
*
* Created on 17 Σεπτέμβριος 2005, 1:22 πμ
*/

package javaapplication1;
import java.io.*;



/**
*
* @author papo
*/
public class Test {
   
   /** Creates a new instance of Test */
   public Test() {
   }
   

   public static void main(String[] args){
     
       Worker wr = new Worker();
       wr.start();
       try{
       while(System.in.read()!=-1){
            wr.interrupt();
           System.out.println("I preesed something");

       }       
       }catch(Exception ex){
           ex.printStackTrace();
       }
   }
   
}



class Worker extends Thread
{



public Worker()
{
	
}

public void run()
{
	
		
		while (!Thread.interrupted())
		{
			System.out.println("Running worker");
		}
	


	System.out.println("interrupted");


}
}

Δημοσ.

Thanks javanidhs για την απαντηση! Τελικα ειχα κατεληξει στον παρακατω κωδικα για να κανω τη δουλεια μου, αλλα ο δικος σου ειναι πολυ πιο απλος. Παντως εμαθα καποια πραγματα ακομα. :D

>
import java.io.*;

public class InfiniteLoopExit implements Runnable {

   public static void main( String[] args ) {
       InfiniteLoopExit ile = new InfiniteLoopExit();
       Thread t = new Thread( ile );
       t.start();
       InputStreamReader isr = new InputStreamReader ( System.in );
       BufferedReader br = new BufferedReader ( isr );
       String s = null;
       try {
           while ( (s = br.readLine ()) != null ) {
               System.out.println( "Done!!" );
               System.exit(0);
           }
       }
       catch ( IOException ioe ) {}
   }
   public void run() {
       while ( true ) {
           System.out.println( "OK" );
           try { 
               Thread.sleep( 1000 ); 
           } catch (InterruptedException ie ) {}
       }
   }
}

 

Edit: Οσον αφορα το System.in.String για System.in.read το πηγαινα ομως μου εβγαζε error εκει περα οποτε ειπα να το δοκιμασω ετσι που τουλαχιστον γινοταν compile..

  • 3 εβδομάδες αργότερα...
Δημοσ.

Το προγραμμα που εγραψα παραπανω δουλευει μια χαρα. Ωστοσο αν παραλειψω την εντολη " Thread.sleep( 1000 ); " το cpu load φτανει στο 100% κατι το οποιο φυσικα δεν ειναι επιθυμητο. Επομενως σκεφτηκα να τροποποιησω το προγραμμα ωστε να ειναι σε κατασταση sleep η αναμονης γενικοτερα μεχρις ωτου γινει καποια συγκεκριμενη διεργασια οπως πχ το πατημα του enter. Ωστοσο δεν μπορω να βρω ακριβως τι πρεπει να κανω. Υποθετω πως το wait() - notify() ισως λυσει το προβλημα μου, αλλα ο κωδικας που εγραψα δεν δουλευει τελειως σωστα..

 

>
import java.io.*;
class wakeThread implements Runnable {

   static boolean test = false;
   static Thread t;
   public static void main( String[] args ) {
       wakeThread wake = new wakeThread();
       t = new Thread( wake );
       System.out.println("Thread started");
       t.start();
       try {
           System.out.println("Thread sleeping");
           t.sleep(2000);
           
       }
       catch (InterruptedException e)
       {
           System.out.println(e);
       }
       System.out.println("Program stoped");
   }
   
   public synchronized void run() {
       try {
           System.out.println("Run");
           if (!test)
           {
               try
               {   
                   System.out.println("Thread waiting");
                   t.wait();
                   System.out.println("System.exit");
                   System.exit(0);
               }
               catch (InterruptedException e)
               {
                   System.out.println(e);
               }
           }
       } catch(Exception e) {}
   }

   public synchronized void delta() {

       InputStreamReader isr = new InputStreamReader(System.in);
       BufferedReader br = new BufferedReader(isr);
       String s = null;
       try {
           while ((s = br.readLine()) != null) {
               test = true;
           }
               t.notify();
               //System.exit(0);
       }        
       catch ( IOException ioe ) {
           // won't happen too often from the keyboard
       }
   }
}

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...