2014-11-09 3 views
1

Я должен сказать, что я новичок в Java. Я использую Eclipse. Я хочу выполнить следующий сценарий и не смог найти, как это сделать:Явный асинхронный ввод и вывод текста

Пока программа java запускает ее, выводит текст на консоль, я также хочу иметь возможность вводить текст и обрабатывать его, не блокируя вывод ожидая ввода.

Предположим, что это:

-thread 1 выводит число на консоль каждую секунду

-thread 2 прослушивает вход

(Код макет)

//**Thread 1:** 

int incrementBy = 0; 

for (int i = 0; i < 1000; i++) { 

    i = i + incrementBy; 

    //Pause for 1 seconds 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     System.out.println("TEXT OUTPUT INTERUPTED"); 
    } 
    //Print text 
    System.out.println(i); 
} 



//**Thread 2:** 
String myIncrement = System.console().readLine(); 

(Now process the input and change the incrementBy var in Thread 1) 

Прямо сейчас в моей программе я использую 1 поток для ввода и еще один для вывода. Но я могу легко изменить дизайн. Все, что я мог найти, было чем-то вроде сервера и клиента, я хотел бы сохранить код в одном месте. И я в настоящее время не знаю, как сделать графический интерфейс с текстовым полем для вывода и одним для ввода.

Вы можете порекомендовать что-нибудь, пожалуйста?

ответ

2

РЕШИТЬ - получается, я очень и очень новой для JAVA.

Кажется, что java позволяет пользователю вводить текст, а другой поток выводится на консоль.

Именно по этой причине я не мог найти что-либо в своих поисках таких вещей, как «ввод и вывод java для консольного асинхронного». У меня была проблема с моим кодом ввода, где я просил ввести данные, и потому, что я знал из однопоточных программ, что программа останавливается, пока я не введу текст, и нажмите enter. Я предположил, что ошибка была выбрана из-за того, что выходной поток принимал консоль и завершение входного потока.

Вот мой код для тех, кто ищет (Возьмите его в качестве руководства, не может работать, если компилируется):

//Main app 
 
public class textInpuOutputManager { 
 

 
    //here we create the two threads (objects that implement the runnable interface) 
 
    static TextInputObject ti; 
 
    static TextOutputObject to; 
 

 
    public static void main(String[] args) { 
 
    //we instantiate the objects 
 
    ti = new TextInputObject(); 
 
    to = new TextOutputObject(); 
 
    //we call the start method to start the threads for input and output 
 
    ti.start(); 
 
    to.start(); 
 
    } 
 

 
} 
 

 

 
//TextInputObject class 
 
public class TextInputObject implements Runnable { 
 

 
    //Method that gets called when the object is instantiated 
 
    public TextInputObject() { 
 
    System.out.println("Created TextInputObject"); 
 
    } 
 

 
    //create a thread object and check if it's not already created 
 
    static Thread thread; 
 

 
    //This method gets called from the main 
 
    public void start() { 
 
    if (thread == null) { 
 
     thread = new Thread(this); 
 
     thread.start(); 
 
    } 
 
    } 
 

 
    //this method gets called by the thread.start(); from above 
 
    @ 
 
    Override 
 
    public void run() { 
 
    System.out.println("Text input thread created and now it runs"); 
 

 
    readTextFromConsole(); 
 
    } 
 

 
    Scanner inputReader = new Scanner(System.in); 
 

 
    //check for input all the time - THIS WILL NOT HALT THE PROGRAM 
 
    public void readTextFromConsole() { 
 
    System.out.println("Enter something:"); 
 
    String myinput = inputReader.nextLine(); 
 
    System.out.println("You Entered: " + myinput); 
 
    readTextFromConsole(); 
 
    } 
 

 
} 
 

 

 
//TextOutputObject 
 
public class TextOutputObject implements Runnable { 
 

 
    //Method that gets called when the object is instantiated 
 
    public TextOutputObject() { 
 
    System.out.println("Created TextOutputObject"); 
 
    } 
 

 
    static Thread thread; 
 

 
    public void start() { 
 
    if (thread == null) { 
 
     thread = new Thread(this); 
 
     thread.start(); 
 
    } 
 
    } 
 

 
    @ 
 
    Override 
 
    public void run() { 
 
    System.out.println("Text output thread created and now it runs"); 
 

 
    //Make it output text every 4 seconds to test if you can input text while it's used for output 
 
    for (int i = 0; i < 100; i++) { 
 
     //Pause for 4 seconds 
 
     try { 
 
     Thread.sleep(4000); 
 
     } catch (InterruptedException e) { 
 
     System.out.println("TEXT OUTPUT INTERUPTED"); 
 
     } 
 
     //Print i to console 
 
     System.out.println(i); 
 
    } 
 
    } 
 

 
}

Также большое спасибо всем, кто взял время ответа

0

Я не знаю точно, что именно вы хотите сделать, но если вы новичок, и вы не знаете, как сделать ГПИ, я бы попробовать JOptionPane

String input = JOptionPane.showInputDialog("User input is returned as a string; use Integer.parseInt(input) to retrieve an integer from this method"); 
0

Вы могли бы сделать два внутренних класса и реализовать Runnable в обоих из них.

import java.util.Scanner; 

public class Test{ 

private Thread t1; 
private Thread t2;  

public static void main(String[] args){ 
    new Test(); 
} 

private class TOne implements Runnable{ 
    public void run(){ 
     int incrementBy = 0; 

     for (int i = 0; i < 1000; i++) { 

      i = i + incrementBy; 

      //Pause for 1 seconds 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       System.out.println("TEXT OUTPUT INTERUPTED"); 
      } 
      //Print text 
      System.out.println(i); 
     } 
    } 
} 

private class TTwo implements Runnable{ 
    public void run(){//Code for Thread 2 
     try{ 
      Scanner scr = new Scanner(System.in); 
      System.out.println(scr.next()); 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 
} 
public Test(){ 
    t1 = new Thread(new TOne()); 
    t1.run(); 
    t2 = new Thread(new TTwo()); 
    t2.run(); 
} 
} 

Не самый элегантный способ, и он не работает безупречно. Вам придется немного поработать со второй нитью. Для получения информации о том, как работает графический интерфейс и т. Д., Вы должны проверить библиотеку Swing. Googling это должно работать нормально.

Некоторые важные ключевые слова для вас wpuld быть: JFrame, JPanel, LayoutManager, JTextArea, JTextField, JButton, ActionListener, Внутренний класс

+0

Спасибо, пользователь3046986, ваш ответ почти такой же, как мой подход, моя проблема была исключением, вызванным плохой кодировкой именно там, где я просил ввода, и из-за моего прошлого опыта я подпрыгнул до конца, что консоль лань не разрешай. Ваш ответ заставил меня лучше взглянуть на мой код. Также спасибо за ключевые слова, я обязательно проверю их. –

Смежные вопросы