Методы, вызываемые перед thread.sleep, не выполняются - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь закодировать основную Java-программу, которая позволяет пользователю перемещать простую составную фигуру, и в ней есть кнопка (QuitButton), которая связана с закрытым классом QuitHandler.Когда нажата кнопка выхода, я хочу, чтобы анимация воспроизводилась в окне программы перед выходом из программы.Я знал, что мне нужно будет ввести задержку, чтобы пользователь мог видеть анимацию до выхода из программы, поэтому я добавил задержку, используя Thread.sleep (1000) после анимации, но до того, как System.exit (0)называется.Поэтому мой код выглядит примерно так:

//in private QuitHandler class (class linked to button)
//An ActionEvent is handed to handle(ActionEvent event) as a parameter
//when the quit button is clicked
public void handle(ActionEvent event) {
    animation.animate();
    this.delay();
    System.exit(0);
}
private void delay() {
  try {
  Thread.sleep(1000);
  }
  catch (InterruptedException e) {
  }
}

Всякий раз, когда я закомментирую this.delay () и System.exit (0), анимация, которую я хочу показать, воспроизводится очень хорошо.И всякий раз, когда я закомментирую animation.animate () и оставляю this.delay () и System.exit (0), всякий раз, когда я нажимаю кнопку выхода, происходит задержка в 1 секунду, а затем программа завершается.Однако, когда я прокомментировал все три (анимация, задержка и System.exit), анимация не воспроизводится , и я получаю только задержку, и программа завершается.

Мое понимание потока управления заставило бы меня поверить, что анимация должна воспроизводиться до того, как будет запущена задержка, поэтому я не понимаю, почему анимация работает сама по себе, но не тогда, когда this.delay ()и System.exit (0) вызываются после него.Я посмотрел метод Thread.sleep () в JavaDocs и не увидел ничего, объясняющего, почему моя реализация метода приведет к тому, что предыдущие методы не будут выполнены.Мое лучшее предположение заключается в том, что в методе Thread.sleep () есть что-то, что вызывает проблему, но я не уверен, что это может быть.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Поскольку метод handle() выполняется в потоке пользовательского интерфейса, результат метода animate() не оценивается до тех пор, пока метод handle() не будет завершен.Поэтому я бы предложил использовать Timer и TimerTask , что-то вроде этого ( взято из этого примера ):

animation.animate();
TimerTask task = new TimerTask() {
  public void run() {
    System.out.println("Task performed after 1 second");
    System.exit(0);
  }
};
Timer timer = new Timer("Timer");
long delay = 1000;
timer.schedule(task, delay);

Таким образом,задержка станет асинхронной, и метод handle() завершится, что позволит потоку пользовательского интерфейса рисовать графику.

Пожалуйста, дайте мне знать, если это поможет:)

0 голосов
/ 14 октября 2018

Попробуйте Thread.wait вместо.Я не знаю, как работает эта анимация, но, возможно, она синхронизируется с текущим потоком.Thread.sleep хранит монитор потока, ожидая освобождения, позволяя другим потокам работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...