Java GUI, нужно приостановить метод без остановки графического интерфейса - PullRequest
3 голосов
/ 19 апреля 2010

Я знаю, что эта проблема вызвана вызовом режима сна или ожидания в главном потоке, и что ответом на решение этой проблемы будет помещение метода в отдельный поток, а затем перевод в спящий режим. Но код - беспорядок, и у него нет времени, чтобы разобраться и разделить его на отдельные потоки, и ему было интересно, есть ли другой способ сделать это? Даже если это не самая чистая или распространенная практика для работы с GUI. Мне нужно всего лишь секундная пауза от метода.

Ответы [ 5 ]

8 голосов
/ 19 апреля 2010

Вы не можете сделать это без создания отдельного потока.Создать поток в Java легко.Единственное, на что следует обратить внимание, это то, что вы можете касаться интерфейса только через основной поток.По этой причине вам нужно использовать что-то вроде SwingUtilities.invokeLater () .

1 голос
/ 19 апреля 2010

Невозможно спать в потоке событий и не вызывать зависание графического интерфейса. Однако в Swing поток событий создается и управляется за кулисами - ваш основной поток (тот, что происходит из метода main()) - это , а не поток событий.

Итак, вы можете спокойно спать в своей основной ветке.

0 голосов
/ 07 июля 2013

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

     void Delay(Long ms){

       Long dietime = System.currentTimeMillis()+ms;
       while(System.currentTimeMillis()<dietime){
           //do nothing
       }
   }

Например: для задержки потока на 5 миллисекод используйте Delay (5L)

0 голосов
/ 26 августа 2011

А где бы объявить эту тему? Имейте в виду, что любая ссылка на функцию, содержащую спящий поток, приведет к приостановке основного потока. Поскольку основной поток должен ждать паузу вспомогательного потока.

Реальность такова, что потоки в действительности не работают как отдельный независимый поток, потому что поток должен быть запущен из другого потока. Другими словами, если вы создаете настольное приложение и даже если вы не работаете с другими потоками, ваше приложение является однопоточным. Теперь, если вы начнете работать с потоками и перевести их в спящий режим, вы скоро обнаружите, что больше ничего не сможете делать в приложении. Нет и нет, другие потоки даже не запускаются, потому что они ждут, когда первый поток завершит спящий режим. Почему это? Причина в том, что потоки являются подпотоками основного потока, и это основной поток, который ожидает, что этот подпоток сна проснется. Вы также не можете создавать приложения без потоков, поскольку java - это одно основное потоковое приложение. Любой, да любой, поток, определенный в вашем приложении, всегда выполняется внутри основного потока.

Если кто-то не докажет, что я неправ, вы, очевидно, никогда не остановите свой основной поток, поскольку это заблокирует ваше приложение. Однако, как только вы определите другой поток и приостановите его с помощью sleep(), это также заблокирует ваше приложение, так как поток был определен в подклассе основного приложения и, следовательно, основного потока.

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

0 голосов
/ 19 апреля 2010

Использование отдельного потока для кода - ваше единственное решение. Каждое действие, начатое потоком Swing, должно быть делегировано отдельному потоку, если в противном случае он заблокировал бы графический интерфейс.

...