我有一个程序,其唯一目的是在无限循环中驱动java.awt.Robot
,直到满足退出条件。
机器人快速连续执行许多操作,这需要它们之间的标准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()
代替。
未能对此事有任何有用的见解,我选择问你们。
答案 0 :(得分:1)
首先,我还假设使用delay()
会生成大量事件,特别是在阅读waitForIdle()
的javadoc之后:
等待直到事件队列中当前所有事件都已处理
但检查Robot.delay()
的源代码后,检查延迟时间为正且不超过1分钟,表明它基本上是Thread.sleep()
!
摘要:两个解决方案几乎相同,使用Thread.sleep()
延迟超过1分钟或捕获InterruptedException。
经过多年的Java编程后,我发现如何在不必捕获InterruptedException的情况下进行睡眠(忽略创建机器人的开销)
答案 1 :(得分:1)
然而,在考虑了一下之后,我假设java.awt.Robot.delay(int ms)会对Robot的操作堆栈进行操作以完成,如果那些是我在无限中的唯一延迟循环,我可能非常快,并且不必要地为机器人生成一个荒谬的大型事件队列。
你的恐惧没有根据。 delay(int)
方法正如javadoc所说的那样。它会延迟调用线程,而不是将“延迟这么长时间”的事件插入到Robot实例的队列中。