2010-07-07 67 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实例的队列中插入“延迟很长”的事件。