2010-07-07 190 views
3

我有一個程序,其唯一目的是在無限循環中驅動一個java.awt.Robot,直到滿足退出條件。Robot.delay(int)與Thread.sleep(long)

機器人快速連續執行多項操作,這些操作之間需要標準的UI延遲。爲此,我使用java.awt.Robot.setAutoDelay(int ms),這似乎是專門爲此目的而設計的。

然而,在其他時候,我需要插入任意長的延遲來完成操作。我似乎在使用java.awt.Robot.delay(int ms)java.lang.Thread.sleep(long ms)之間有一個選擇,我很好奇他們之間的差異是什麼,以及我應該使用哪一個。

我的直覺就是讓我所有的操作都保持在同一個「地點」,並使用java.awt.Robot.delay(int ms)。然而,在想了一會之後,我認爲java.awt.Robot.delay(int ms)會對機器人的操作堆棧進行操作來完成,如果這些操作是我在無限循環中的唯一延遲,那麼我可能會很快並且毫無必要地產生一個荒謬的結果機器人的大型事件隊列。

在這一點上,我檢查the API for java.awt.Robot.delay(int ms),這給我講了:

休眠指定的時間。要捕獲發生的任何InterruptedException,可以使用Thread.sleep()代替。

我沒有得到任何有用的見解,我選擇了問你們。

回答

1

起初我還以爲使用delay()會產生較大的隊列中的事件,尤其是閱讀的Javadoc waitForIdle()後:

等待,直到目前的事件隊列中的所有事件被處理

但檢查Robot.delay()的源代碼顯示,它基本上是Thread.sleep(),在檢查延遲時間爲正值且不超過1分鐘後!

摘要:這兩種解決方案都差不多,用Thread.sleep()延遲時間超過1分鐘或捕捉InterruptedException異常。

經過多年的編程與Java,我發現如何,而不必趕InterruptedException的(不考慮創建一個機器人的開銷)

1

但是睡不着,想了一會兒後,我以爲java.awt.Robot.delay(int ms)會將一個操作放到Robot的堆棧操作上來完成,如果這些操作是我在無限循環中的唯一延遲,那麼我可能會很快並且毫無必要地生成一個荒謬的大隊列的機器人事件。

你的擔憂是多餘的。 delay(int)方法正是javadoc所說的。它延遲了調用線程,而不是在Robot實例的隊列中插入「延遲很長」的事件。