2016-08-02 13 views
1

Ich will nur learning... so lange drucken, wie ich eingeben 1-Konsole mit zwei Threads

package a; 

    import java.util.Scanner; 

    class main extends Thread { 
     static String n; 

     Scanner reader = new Scanner(System.in); 
     public void run() { 
      n = reader.nextLine(); 
     } 

     public static void main(String args[]) throws InterruptedException { 
      (new Thread(new main())).start(); 
      n="5"; 
      System.out.println("1 = ON\n0 = OFF"); 
      while (n.equals("1")) { 
       System.out.println("Learning.."); 
      } 
     } 
    } 
+0

Erwarten Sie 'while (n equals (" 1 "))' zu loopen, während 'n =" 5 "'? Vielleicht möchten Sie auch auf Multithreading und Datenrennen nachlesen. –

+0

Nun, als ich es nicht definiert habe, hat es mir einen Fehler gemacht. – nooby

+0

Ich möchte nur in der Lage sein, es aus- und wiederzuschalten, das ist alles. – nooby

Antwort

0

Wenn Sie versuchen, den Start zu stoppen, ist es immer besser, zwei Threads für den Druck und andere für die Eingabe zu erhalten. Versuchen Sie es mit dem Schlagcode. Es funktioniert gut für mich.


    public class ThreadsStop { 

    static String n=""; 

    class Printer extends Thread{ 

     @Override 
     public void run() { 

      while(!n.equals(null)){ 

       try { 
        Thread.sleep(1000); 

        if(n.trim().equals("1")) 
         System.out.println("Learning.."); 

       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

      } 

     } 

    } 

    class Starter extends Thread{ 

     @Override 
     public void run() { 

      Scanner reader = new Scanner(System.in); 

      while(true){ 
       System.out.println("1 = ON \n 0 = OFF"); 
       n= reader.nextLine(); 
      } 
     } 

    } 

    public static void main(String[] args) { 

     new ThreadsStop().start(); 

    } 

    private void start() { 

     new Starter().start(); 
     new Printer().start(); 

    } 

} 
0

Sie können beim Lesen oben auf dem Producer-Consumer-Muster interessieren. Sie können einen Blick hier http://javarevisited.blogspot.fr/2012/02/producer-consumer-design-pattern-with.html und versuchen, mit so etwas wie

class main extends Thread { 

// a thread-safe queue for decoupling reading and writing threads avoiding 
// synchronization issues. The capacity of the queue is 1 to avoid reading (producing) a 
// command without having handled (consumed) the previous before 
private static final BlockingQueue<String> sharedQueue = new LinkedBlockingQueue<>(1); 

Scanner reader = new Scanner(System.in); 

public void run() { 
    while (true) { 
     String s = reader.nextLine(); 
     try { 
      //if the queue is empty, adds the element, 
      //otherwise blocks waiting for the current element to be handled by main thread 
      sharedQueue.put(s); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 

public static void main(String args[]) throws InterruptedException { 
    (new Thread(new main())).start(); 

    System.out.println("1 = ON\n0 = OFF"); 
    while (true) { 
     //will block till an element is available, then removes and handles it 
     final String s = sharedQueue.take(); 
     if ("1".equals(s)) { 
      System.out.println("Learning.."); 
     } 
    } 
} 

}

+0

Dies scheint eine nette Lösung zu sein - denken Sie bitte darüber nach, warum dieser Code funktionieren sollte - Sie können auch Kommentare in den Code selbst einfügen - und Erklärungen bereitstellen, die dem Rest der Community helfen zu verstehen, was Sie zu lösen hatten /beantworte die Frage. – ishmaelMakitla

+0

Eine Sache jedoch, Es ist keine Schleife, wenn Eingang 1 es nur einmal tut – nooby

0

Verwendung kann der Code unten angegeben verwenden.

0

Versuchen Sie unter Programm, es wird Ihre Eingabe nehmen und es ausdrucken.

class main extends Thread { 
    static String n; 

    Scanner reader = new Scanner(System.in); 
    public void run() { 
     System.out.println("Enter n value "); 
     n = reader.nextLine(); 
    } 

    public static void main(String args[]) throws InterruptedException { 
     (new Thread(new main())).start(); 
     n="5"; 
     System.out.println("1 = ON\n0 = OFF"); 
     while (n.equals("5")) { 
      //System.out.println("Learning.."); 
     } 
     System.out.println(n); 
    } 
} 

Der Grund, warum der Code nicht eingegeben nehmen wird, bevor die Eingabe des Hauptmechanismus ausgeführt Bereitstellung, die abgeschlossen, dass die Programmausführung bedeutet. Ich habe einige Änderungen an Ihrem Code vorgenommen. Jetzt nimmt dein Code deine Eingabe entgegen.