Robot.delay(int)与Thread.sleep(long)

时间:2010-07-07 20:58:27

标签: java multithreading delay sleep awtrobot

我有一个程序,其唯一目的是在无限循环中驱动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()代替。

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

2 个答案:

答案 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实例的队列中。