получить результат таймера в java - PullRequest
0 голосов
/ 10 июля 2020

, поэтому у меня есть таймер из java .util.timer, и внутри его метода запуска я создаю объект из другого класса и помещаю результат в массив stati c, как показано ниже:

public class Generator {

public Timer timer;
int seconds = 2;
final int maxCalls = 3;
int currNumCall = 0;
public static boolean running = false;

public Generator() {
    this.timer = new Timer();
    this.timer.schedule(new ReminderTask(), seconds * 1000);
}

class ReminderTask extends TimerTask {

    @Override
    public void run() {

        if (currNumCall < maxCalls) {
            System.out.println("picking up a new call");
            running = true;
            int i = ThreadLocalRandom.current().nextInt(0, 2);
            Call call;
            if (i > 0) {
                call = new Call("high", LocalDateTime.now());

            } else {
                call = new Call("low", LocalDateTime.now());
            }
            calls.add(call);
            currNumCall += 1;
            timer.cancel();
            timer = new Timer();
            timer.schedule(new ReminderTask(), seconds * 1000);
        } else {
            timer.cancel();
            running = false;
        }

    }

}

и в другом классе я инициирую объект из класса генератора, чтобы заполнить массив вызовов, теперь мне нужно выполнить некоторые операции с вызовами, поэтому я делаю что-то вроде этого ниже:

public class Fire_staton_problem {

public static ArrayList<Junior> juniors = new ArrayList<>();
public static ArrayList<Senior> seniors = new ArrayList<>();
public static ArrayList<Manager> managers = new ArrayList<>();
public static ArrayList<Director> directors = new ArrayList<>();
public static ArrayList<Call> calls = new ArrayList<>();
public Generator generator;
public Fire_staton_problem() {
    generator = new Generator();
}

public static void main(String[] args) {

Fire_staton_problem f = new Fire_staton_problem();
    while(f.generator.isRunning()) {
        if (calls.size() > 0) {
            System.out.println(calls);
        }else {
            System.out.println("empty :)");
        }
    }

}

}

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

1 Ответ

0 голосов
/ 10 июля 2020

Посмотрите на шаблон «Производитель-Потребитель», потому что это, по сути, то, чем он является - Generator - производитель, а ваш Fire_staton_problem - потребитель. Очевидные вещи:

  1. Ваши while l oop занятые спины, проверяющие список, но здесь вам нужен BlockingQueue вместо простого списка, поэтому, когда он пуст, он приостанавливается поток main и разбудит его, когда ваш Generator поместит в него Call.
  2. Вам не нужно создавать новый экземпляр Timer для повторного запуска задачи , просто используйте Timer(task, 0, delay) конструктор, чтобы повторить задачу.
...