Thread.sleep (n) блокирует другие действия? Что лучше заменить?

1

У меня есть небольшое время подсчета приложений, нажимая кнопку,
Я просто использую thread.sleep() для подсчета.

Когда кнопка нажата, она вызывает ActionListener, который является классом, который выполняет thread.run(). Затем thread.sleep() запускается из функции run().

//The Thread
class twentyMins implements Runnable
    @Override
    public void run() {
        try {
            Thread.sleep(1000*60*20);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
    }
}

//The ActionListener
class Reset implements ActionListener {

    public static twentyMins count = new twentyMins();

    @Override
    public void actionPerformed(ActionEvent event) {
        count.run();
    }

}

Проблема в том, что кнопка не будет отскакивать и снова быть нажата.
И приложение даже не может быть остановлено нажатием кнопки EXIT на JFrame.

Прямо, я думаю, что мое приложение заморожено во время работы thread.sleep().

Есть ли что-то лучше, чем Thread.sleep()?

Теги:
sleep

3 ответа

6
Лучший ответ

Вы на самом деле не начали фоновый поток. Любой объект может реализовать Runnable (и метод run), но это не делает его потоком. Следовательно, когда нажата кнопка "Сброс", она блокирует отдельный поток, отвечающий за пользовательский интерфейс.

Вам необходимо передать свой Runnable объект в конструктор класса Thread (java.lang.Thread), как описано в официальных документах.

1

Чего ты ожидал? Вы звоните

count.run();

Который будет работать в том же основном потоке, тем самым блокируя его в течение 20 минут. Подумайте о создании потока и вызове start() на нем.

0

Для выполнения sleep() в основном потоке будет заблокирован пользовательский интерфейс. Вы можете создать другой поток или просто использовать класс java.util.Timer для выполнения этой задачи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню