猿问

在未执行 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() 方法有一些问题导致了这个问题,但我不确定它可能是什么。



qq_遁去的一_1
浏览 213回答 2
2回答

慕沐林林

试试吧Thread.wait。我不知道那个动画是如何工作的,但也许它与当前线程同步。Thread.sleep保持线程的监视器,而等待释放它允许其他线程运行。

MM们

由于该handle()方法是在 UI 线程上执行的,因此在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()方法将完成,从而允许 UI 线程绘制图形。如果有帮助,请告诉我:)
随时随地看视频慕课网APP

相关分类

Java
我要回答