为了账号安全,请及时绑定邮箱和手机立即绑定

在未执行 thread.sleep 之前调用的方法

在未执行 thread.sleep 之前调用的方法

qq_遁去的一_1 2021-11-17 15:35:25
我正在尝试编写一个基本的 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 clickedpublic 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() 方法有一些问题导致了这个问题,但我不确定它可能是什么。
查看完整描述

2 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-11-17
?
MM们

TA贡献1886条经验 获得超2个赞

由于该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 线程绘制图形。


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


查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信