Вопрос по java – Thread.Sleep () зависает

1

Вот фрагмент

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

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

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

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

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

Опять же, используйте Swing Timer. Смотрите ссылку в моем ответе. Hovercraft Full Of Eels

Ваш Ответ

3   ответа
3

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

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

Ага. 1+ и согласен.
@HovercraftFullOfEels +1 вам тоже ;-)
0

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

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

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

6

поскольку это приведет к тому, что сам поток событий перейдет в спящий режим. Так как этот поток отвечает за всю рисование Swing и взаимодействие с пользователем, это переведет ваше приложение в спящий режим.

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

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

Отлично - рад, что помог!
SwingTimer работал довольно хорошо, спасибо user1357159

Похожие вопросы