Robot.delay (int) против Thread.sleep (long) - PullRequest
3 голосов
/ 08 июля 2010

У меня есть программа, единственной целью которой является управление java.awt.Robot в бесконечном цикле до тех пор, пока не будет выполнено условие выхода.

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

В этот момент я проверил API для java.awt.Robot.delay(int ms), который сказал мне следующее:

Спит в течение указанного времени.Чтобы поймать любые InterruptedException s, которые могут возникнуть, вместо этого можно использовать Thread.sleep().

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

Ответы [ 2 ]

1 голос
/ 08 июля 2010

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

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

1 голос
/ 08 июля 2010

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

Ожидание, пока все события в настоящее время в событииочередь обработана

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

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

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

...