首页 > 解决方案 > 在未执行 thread.sleep 之前调用的方法

问题描述

我正在尝试编写一个基本的 Java 程序,该程序允许用户移动一个简单的复合形状,并且在其中,我有一个链接到私有 QuitHandler 类的按钮 (QuitButton)。单击退出按钮时,我希望在退出程序之前在程序窗口中播放动画。我知道我必须实现延迟,以便用户能够在程序退出之前看到动画,所以我在动画之后但 System.exit(0) 之前使用 Thread.sleep(1000) 添加了延迟叫。所以我的代码看起来像这样:

//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 ) 在它之后被调用。我在 JavaDocs 上查找了 Thread.sleep() 方法,但没有看到任何解释为什么我的方法实现会导致以前的方法不被执行的原因。我最好的猜测是 Thread.sleep() 方法引起了这个问题,但我不确定它可能是什么。

标签: javaanimation

解决方案


由于该handle()方法是在 UI 线程上执行的,因此在方法完成animate()之前不会评估该方法的结果handle()。因此我建议使用TimerTimerTask做这样的事情(取自这个例子):

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()方法将完成,允许 UI 线程绘制图形。

如果有帮助,请告诉我:)


推荐阅读