Thread.Sleep() зависает

Вот фрагмент

kit.insertHTML(doc, doc.getLength(), "Hello", 0, 0, null);
try{
Thread.sleep(1000);
}catch(Exception e){}

Я использую HTMLEditorKit() и HTMLDocument() в качестве текстового поля. В текстовом поле должно отображаться «Привет», затем подождать одну секунду, однако, когда я пытаюсь это сделать, оно ждет одну секунду, а затем помещает слово «Привет», чего я не хочу.

Я не уверен, почему это происходит, потому что я поставил это в логическом порядке. Если кто-нибудь может помочь мне с этим, это было бы здорово.

РЕДАКТИРОВАТЬ:

Кто-нибудь знает альтернативу, чтобы я мог использовать эффект «задержки»?


person user1357159    schedule 21.05.2012    source источник
comment
Опять же, используйте Swing Timer. Смотрите ссылку в моем ответе.   -  person Hovercraft Full Of Eels    schedule 21.05.2012


Ответы (3)


Никогда не вызывайте Thread.sleep(...) из потока событий Swing, так как это приведет к тому, что сам поток событий будет спать. Поскольку этот поток отвечает за рисование Swing и взаимодействие с пользователем, это переведет ваше приложение в спящий режим.

Если вам нужна только задержка отображения, рассмотрите возможность использования Swing Таймер.

Если, с другой стороны, ваш поток событий скомпрометирован длительной задачей, выполните задачу в фоновом режиме, используя SwingWorker (как предложил ему Гийом 1+).

person Hovercraft Full Of Eels    schedule 21.05.2012

Вы вызываете sleep в EDT (поток диспетчеризации событий). Вам следует избегать этой ситуации, так как она действительно замораживает пользовательский интерфейс.

Чтобы избежать этой ситуации, используйте SwingWorker. вместо этого или как предложено HFOE, используйте Swing Timer

person Guillaume Polet    schedule 21.05.2012
comment
@HovercraftFullOfEels +1 и вам ;-) - person Guillaume Polet; 21.05.2012

Thread.sleep — это длительная задача. Когда вы запускаете такую ​​задачу в EDT, она блокирует выполнение всех запросов на перерисовку. Все ожидающие обработки запросы на перерисовку, которые были отправлены на этапе ожидания, ставятся в очередь для будущей обработки.

В результате, когда EDT выходит из фазы sleep, он объединяет все такие запросы на перерисовку (если объединение включено, что является свойством по умолчанию) в одну перерисовку, которая выполняется. Если объединение не включено, то все запросы в очереди выполняются последовательно без каких-либо временных промежутков между ними. В результате кажется, что пользовательский интерфейс не обновлялся.

Чтобы исправить ситуацию, используйте SwingTimer, который срабатывает периодически через определенные промежутки времени, или SwingWorker.

person Extreme Coders    schedule 22.01.2013