Я пытаюсь использовать объект сканера для постоянной передачи значений Long таймеру. Если таймер не используется , объект таймера должен работать в течение количества секунд, заданных значением Long, затем выведите «Таймер завершен». Если это - это уже используется, программа должна вывести «Таймер уже используется», а игнорировать значение Long. Как только таймер завершит предыдущее задание, он должен принять следующее значение Long от сканера и снова начать обратный отсчет указанного количества секунд. На данный момент у меня есть приведенный ниже код, который просто последовательно ставит задания в очередь и ждет, пока таймер не освободится, перед запуском следующего, вместо того, чтобы игнорировать промежуточные запросы, когда таймер занят. Я добавил проверку task.isAlive (), чтобы помочь мне понять, что происходит, любая помощь будет очень признательна.
Текущий вывод для значений сканера 3,10,1,3:
Thread-0 is not alive.
3
Timer is done!
Thread-1 is not alive.
10
Timer is done!
Thread-2 is not alive.
1
Timer is done!
Thread-3 is not alive.
3
Timer is done!
Желаемый вывод для значений сканера 3,10,1,3 (потребует удаления дополнительных операторов печати, используемых в настоящее время для отладки)
Timer is complete // for 3
Timer already in use // for 1
Timer already in use // for 3
Timer is complete // for 10
Код:
import java.util.*;
import java.io.*;
class Timer extends TimerTask implements Runnable {
Long sleepTime;
Timer(Long inputTime) {
sleepTime = inputTime;
}
@Override
public void run() {
try {
System.out.println(sleepTime);
Thread.sleep(sleepTime * 1000);
System.out.println("Timer is complete");
} catch (InterruptedException e) {
System.out.println(sleepTime);
System.out.println("Timer already in use");
}
}
}
public class TimerMain {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
Long inpt = in.nextLong();
Runnable t = new Timer(inpt);
Thread task = new Thread(t);
if (task.isAlive()) {
System.out.format("Timer already in use");
} else {
System.out.format("%s is not alive.%n", task.getName());
task.start();
try {
task.join();
}
catch (InterruptedException e){
System.out.println("Timer already in use");
}
}
}
in.close();
}}