Ввод с использованием потока

import java.util.Scanner;

public class ThreadClass {

    public static void main(String[] args) 
    {
        System.out.println("Type the following in 5 seconds");
        System.out.println("The quick brown fox jumps over the lazy dog");

        try {
            Scanner sc = new Scanner(System.in);
            String str=sc.nextLine();
            Thread.sleep(1000);
            System.out.println("Your time is over");

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

В приведенной выше программе я хочу, чтобы моя программа просила пользователя ввести ввод в течение пяти секунд (или 5000 миллисекунд независимо) и должна автоматически закрываться и отображать сообщение "Ваше время истекло" после того, как время истекло. Проблема с этим кодом состоит в том, что всякий раз, когда пользователь вводит данные до тех пор, пока нажата клавиша Enter, поток не работает. Я попытался написать код сканера вне блока try catch и даже ниже потока, но ни один из них, похоже, не работает. Я думаю, что проблема с моим классом сканера, но не могу понять, как вводить данные в противном случае.

3 ответа

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

final Thread subject1 = new Thread(new Runnable() {

  public void run() {
    while (!Thread.interrupted()) {
      Thread.yield();
    }
    System.out.println("subject 1 stopped!");
  }
});
final Thread subject2 = new Thread(new Runnable() {

  public void run() {
    while (!Thread.interrupted()) {
      Thread.yield();
    }
    System.out.println("subject 2 stopped!");
  }
});
final Thread coordinator = new Thread(new Runnable() {

  public void run() {
    try {
      Thread.sleep(500);
    } catch (InterruptedException ex) { }
    System.out.println("coordinator stopping!");
    subject1.interrupt();
    subject2.interrupt();
  }
});
subject1.start();
subject2.start();
coordinator.start();

Почему бы вам не попробовать этот код, рассчитав время, если ваш единственный мотив - проверить, вводит ли пользователь ввод в течение 5 секунд или нет

Scanner sc = new Scanner(System.in);
        long begantime = System.nanoTime();
        System.out.println("Enter something");
        String input = sc.nextLine();
        int totalTime = (System.nanoTime()-beganTime)/1000000000;
        if (time > 5)
            System.out.println("failed");
        else
            System.out.println(input);
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;

public class Test {
    static volatile boolean isTimeCopleted = true;

    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {

            @Override
            public void run() {
                if (isTimeCopleted) {
                    System.out.println("Your time is over");
                    System.exit(0);
                }
            }
        };
        timer.schedule(task, 5000);

        System.out.println("Type the following in 5 seconds");
        System.out.println("The quick brown fox jumps over the lazy dog");

        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        isTimeCopleted = false;


        System.out.println("Process Done");
        System.exit(0);
    }
}
Другие вопросы по тегам