Ввод с использованием потока
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);
}
}