2015-08-13 2 views
6

Я пишу действительно базовую программу, но у меня возникла проблема. Ниже приведен фрагмент моего кода (это действительно глупо программы, не пытайтесь угадать, что я использую его для.)Отключить ввод пользователя до тех пор, пока Thread.sleep() не закончит

System.out.println("Please press the Return button a 1000 times."); 
    for(int i = 1;i < 25;i++) { 
     input.nextLine(); 
    } 
    System.out.println("Stop! Stop! Jeez, that was a joke! Do you think I'd make you press that button a 1000 times?"); 
    try { 
    Thread.sleep(3000); 
    } catch (InterruptedException e) {} 
    System.out.println("Let's move on."); 

Что произошло бы в том, что программа запрашивает у пользователя нажмите кнопку «Возврат» в 1000 раз, и пользователь в конечном итоге начнет спам. Основная проблема заключается в том, что после того, как я заявляю, что это была шутка, и ему нужно было только 25 раз нажать ее, я бы хотел отключить ввод пользователя, так как, скорее всего, пользователь несколько раз нажимает кнопку, прежде чем осознать, что я просто шутка. Но когда выполняется thread.sleep, пользовательский ввод все еще активен, что приводит к множеству проблем.

Итак, есть ли способ отключить ввод пользователя во время сна?

+0

Почему вы заботитесь? Это потому, что программа собирается читать что-то еще из 'input' позже? Если 'input' является консолью, тогда« отключение »может быть сложным. Возможно, лучшим решением будет чтение и игнорирование лишних пустых строк в следующий раз, когда ваша программа хочет, чтобы пользователь набирал что-то. –

ответ

-1

Я считаю, что достаточно добавить 1 строку в ваш код (Иак большое предложение):

System.out.println("Let's move on."); 
System.in.read(new byte[System.in.available()]);//read and ignore 
+1

Это прямолинейно, но очень системно зависит от того, как System.in ведет себя точно. Иногда доступно() просто возвращает всегда 0 (входная реализация InputStream, см. Javadoc). – Gustave

+1

Доступный() метод должен * никогда * использоваться для угадывания размера доступных входов, его полная реализация зависит от того, как фактическое количество входных данных и возвращаемая сумма коррелируют. Хотя в некоторых настройках он может отлично работать, это одно из тех злоупотреблений, которые приходят вам на укусы, когда вы меньше всего ожидаете этого в самое неподходящее время. – Durandal

1

Вы можете контролировать то, что читать из консоли с помощью приложения .. Но, чтобы отключить ввод полностью будет в зависимости от типа приложения среды работает ... Например в строке cmd он не должен позволять вам вводить после 25 входов ... В то время как в среде IDE, например eclipse, вы можете вводить на консоль, но после 25 строк она не будет считаться приложением.

0

Посмотрите на это:

public class Main {  

private static final String QUIT = "quit"; 
private static final int COUNT = 1000; 

public static void main(String[] args) throws InterruptedException { 
    new Main(new BufferedReader(new InputStreamReader(System.in))).main(); 
} 

private final BufferedReader in; 
private final BlockingQueue<String> lines = new ArrayBlockingQueue<>(1); 
private volatile boolean ignore; 

public Main(BufferedReader in) {this.in = in;} 

private void main() throws InterruptedException { 
    Thread inputReader = new Thread(this::read, "input-reader"); 
    inputReader.setDaemon(true);   
    System.out.println("Please press the Return button a "+COUNT+" times."); 
    inputReader.start(); 
    String line = ""; 
    for(int i = 1;i <= 25;i++) { 
     line = lines.take(); 
     System.out.println("Good! You entered '"+line+"'. Only "+(COUNT-i)+" left."); 
    } 
    System.out.println("Stop! Stop! Jeez, that was a joke! Do you think I'd make you press that button a "+COUNT+" times?"); 
    ignore = true; 
    Thread.sleep(3000); 
    ignore = false; 
    String optionalLine = lines.poll(); 
    if(optionalLine!=null) { 
     line = optionalLine; System.out.println("Ignored:" + line); 
    } 
    System.out.println("Let's move on. Type "+QUIT+" when you're tired."); 
    while(!QUIT.equalsIgnoreCase(line)){ 
     line = lines.take(); 
     System.out.println(">"+line); 
    } 
    System.out.println("Bye."); 
} 

private void read(){ 
    try { 
     String line = in.readLine(); 
     while(line!=null){ 
      if (ignore) { 
       boolean inserted = lines.offer(line); 
       if (!inserted) 
        System.out.println("Ignored:" + line); 
      } else {lines.put(line);} 
      line = in.readLine(); 
     }   
    } catch (IOException|InterruptedException e) {e.printStackTrace();} 
} 

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