2010-07-07 4 views
3

У меня есть программа, единственная цель которой - управлять java.awt.Robot бесконечным циклом до тех пор, пока не будет выполнено условие выхода.Robot.delay (int) по сравнению с Thread.sleep (long)

Робот выполняет ряд действий в быстрой последовательности, для чего требуется стандартная задержка пользовательского интерфейса между ними. Для этого я использую 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 s, которые происходят, вместо этого может использоваться Thread.sleep().

Не сумев получить какое-либо полезное понимание этого вопроса, я решил спросить вас, ребята.

ответ

1

Сначала я хотел бы также предположить, что использование delay() будет генерировать большие очереди событий, в частности, после прочтения Javadoc для waitForIdle():

Ждет, пока все события в настоящее время на очереди событий не были обработаны

, но проверка исходного кода Robot.delay() показывает, что в основном это Thread.sleep(), после проверки того, что время задержки положительное и не более 1 минуты!

Аннотация: оба решения практически одинаковы, используйте Thread.sleep() для задержки более 1 минуты или перехвата InterruptedException.

после многих лет программирования с Java я нашел, как спать, не поймать InterruptedException (без учета накладных расходов на создание робота)

1

Однако, подумав об этом на мгновение, я предположил, что java.awt.Robot.delay (int ms) выполнит операцию над стеком операций робота, и если бы это были мои единственные задержки в бесконечном цикле, я могу очень быстро и бесполезно генерировать абсурдно большую очередь событий для робота.

Ваши опасения необоснованны. Метод delay(int) делает именно то, что говорит javadoc. Он задерживает вызывающий поток, а не вставляет событие «delay for so long» в очередь экземпляра Robot.

Смежные вопросы