Вызов сна в текущем потоке останавливает мой основной графический интерфейс

У меня один класс DataThread наследуется от Thread. Я использую два DataThread объекты ReadThread а также WriteThread, У меня есть другая тема, где Main_GUI бежит.

Теперь, когда я нажимаю кнопку на main_GUI это вызывает метод x.method1() а затем этот метод использует метод WriteThread WriteThread.sleepForReset(). В

public void sleepForReset(){
    try {
        sleep(28000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Когда я нажимаю кнопку на main_GUI GUI останавливается для 28000 милисекунд. Если я звоню спать на WriteThread тогда почему он останавливает main_GUI? Потому что сон - это статический метод? Если да, может кто-нибудь предложить, как спать WriteThread без влияния Main_GUI?

3 ответа

Решение

Спасибо всем за то, что вы предложили мне разные варианты..... Но я использовал TimeTask.schedule() и работал. Я запланировал свою работу на потом, вместо использования сна в текущей теме......

Если вы звоните WriteThread.sleepForReset() из вашего actionPerformed метод, вы на самом деле вызываете его из потока EventDispatch. Даже если у вас есть объект, который представляет ваш WriteThread, вызов метода для этого объекта из потока EventDispatch вызовет выполнение процесса в EDT.

Посмотрите на это руководство по использованию рабочих потоков в Java. Обратите внимание, что недостаточно просто иметь класс, который наследуется от Threadвам нужно иметь экземпляры этих потоков, чтобы иметь многопоточное приложение. Предоставленное руководство даст вам хорошее представление о том, как начать работу.

Я думаю, что называть людей Geeks - не обязательно хороший способ получить помощь, но чтобы ответить на ваш вопрос, вы видите сон, потому что вы вызываете Thread.sleep в потоке рассылки событий. GUI-операции Swing выполняются в этом единственном потоке. Если вам нужно выполнить длительную фоновую работу, вы должны делегировать ее SwingWorker.

Кроме того, обработка прерванного исключения не очень надежна. По крайней мере, вы должны прерывать поток с помощью Thread.currentThread(). Interrupt().

Другие вопросы по тегам