Не использовать sleep в потоке событий. Я предполагаю, что ваше приложение Swing (пожалуйста, сообщите нам, если это правильно или нет), и если это так, вызов Thread.sleep(...)
в потоке событий приведет к тому, что весь ваш графический пользовательский интерфейс уснет, и он не будет отвечать. Вместо этого, если это приложение Swing, используйте таймер Swing.
Учебное пособие: Как использовать Swing Timers
Редактировать 1
Примечание: здесь есть много рекомендаций по использованию SwingWorker, и они могут быть полезны, но я бы воздержался от их использования, если только код, который необходимо сделать между промежутками времени, не сильно загружает процессор и занимает немного времени, например, чтение в среднем или большом файле. Если все, что вы делаете - это рисуете круг, затем делаете паузу, а затем рисуете другой круг, SwingWorker - это излишнее излишество, и снова вам нужно использовать Swing Timer, который гораздо проще реализовать.
Как и во всех рекомендациях, ответы будут зависеть от специфики вашей проблемы, и вы можете рассказать нам больше.