Игнорировать ввод сканера, если таймер запущен, иначе запустить таймер на x количество секунд (x = ввод сканера) - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь использовать объект сканера для постоянной передачи значений 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();
}}

1 Ответ

1 голос
/ 08 мая 2020

Проблема в том, что вы создаете новый Thread объект на каждой итерации и проверяете, есть ли isAlive на этом вновь созданном объекте. Это никогда не будет правдой, если вы проверите его перед запуском.

Вам нужно сохранить объект между итерациями. Затем, если предыдущий Thread либо равен нулю, либо не работает, вы создаете новый вместо предыдущего. Код может выглядеть примерно так:

public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    Thread task = null;
    while (in.hasNext()) {
        Long inpt = in.nextLong();
        Runnable t = new Timer(inpt);
        if (task != null && task.isAlive()) {
            System.out.format("Timer already in use");
        } else {
            task = new Thread(t);
            System.out.format("%s is not alive.%n", task.getName());
            task.start();
        }
    }
    in.close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...