Вызов сна в текущем потоке останавливает мой основной графический интерфейс
У меня один класс 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().