Вызов сна в текущем потоке останавливает мой основной графический интерфейс - PullRequest
0 голосов
/ 08 января 2010

У меня есть один класс 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, графический интерфейс останавливается на 28000 миллисекунды. Если я звоню спать на WriteThread, то почему он останавливает main_GUI? Потому что сон - это статический метод? Если да, может кто-нибудь предложить, как спать WriteThread, не влияя на Main_GUI?

Ответы [ 3 ]

6 голосов
/ 08 января 2010

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

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

1 голос
/ 08 января 2010

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

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

0 голосов
/ 08 января 2010

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

...