4

我有一个程序,其唯一目的是java.awt.Robot在无限循环中驱动 a 直到满足退出条件。

机器人快速连续执行许多动作,这需要它们之间的标准 UI 延迟。为此,我使用java.awt.Robot.setAutoDelay(int ms),它似乎正是为此目的而设计的。

然而,在其他时候,我需要插入任意长的延迟才能完成操作。我似乎可以在使用java.awt.Robot.delay(int ms)or之间进行选择java.lang.Thread.sleep(long ms),并且很好奇它们之间的区别是什么,以及我应该使用哪个。

我的直觉是把我所有的操作都放在同一个“地方”,并使用java.awt.Robot.delay(int ms). 然而,想了一会儿之后,我认为这java.awt.Robot.delay(int ms)会在机器人的操作堆栈上完成一个操作,如果这些是我在无限循环中的唯一延迟,我可能会很快且不必要地生成一个荒谬的大机器人的事件队列。

那时,我检查了 的 APIjava.awt.Robot.delay(int ms),它告诉我以下内容:

休眠指定的时间。要捕获任何InterruptedException发生的 s,Thread.sleep()可以改为使用。

由于未能对此事获得任何有用的见解,我选择问你们。

4

2 回答 2

2

起初,我还假设 usingdelay()会生成大量事件,特别是在阅读 javadoc 之后waitForIdle()

等待,直到当前事件队列中的所有事件都已处理完毕

但是查看源代码Robot.delay()显示基本上是a Thread.sleep(),在查看延迟时间为正且不超过1分钟后!

摘要:两种解决方案几乎相同,Thread.sleep()用于延迟超过 1 分钟或捕获 InterruptedException。

经过多年的 Java 编程,我发现了如何在不捕获 InterruptedException 的情况下睡觉(忽略创建机器人的开销)

于 2010-07-07T22:09:11.687 回答
1

然而,在考虑了片刻之后,我认为 java.awt.Robot.delay(int ms) 会在机器人的操作堆栈上完成一个操作,如果这些是我在无限循环中唯一的延迟,我可能会很快且不必要地为机器人生成一个大得离谱的事件队列。

你的担心是没有根据的。该delay(int)方法完全按照 javadoc 所说的做。它会延迟调用线程,而不是在 Robot 实例的队列中插入“延迟这么长时间”事件。

于 2010-07-07T22:38:21.300 回答