我正在嘗試編寫一個基本的 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
保持線程的監視器,而等待釋放它允許其他線程運行。

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 線程繪制圖形。
如果有幫助,請告訴我:)
添加回答
舉報
0/150
提交
取消