Thread.join замораживает индикатор выполнения - PullRequest
1 голос
/ 16 ноября 2011

У меня есть код, который использует поток для запуска нескольких индикаторов выполнения.

Thread thread1 = new Thread(progressbar1);
thread1.start(); 
thread2.start()

И так далее. После того, как у меня есть

thread1.join(); 
thread2.join(); 
thread3.join();

Но это останавливает анимацию всех трех индикаторов выполнения и показывает завершение только после завершения всех потоков. Как решить эту проблему? Спасибо.

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

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

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

Уже предоставленный механизм обратного вызова, доступный в Java 6+: SwingWorker. Реализуйте работника, поместив join() s (и start() s) в метод doInBackground(). Тогда любые операции Swing, которые вы хотите выполнить позже, могут перейти в done().

1 голос
/ 16 ноября 2011

Вы блокируете поток пользовательского интерфейса.Ты не должен этого делать.Опции:

  • Иметь другой поток , который просто вызывает join на первых трех.Бесполезно с точки зрения создания другого ресурса, но достаточно просто.
  • Используйте счетчик - убедитесь, что вы используете что-то вроде AtomicInteger, чтобы избежать проблем с моделью памяти и проблемами состояния гонки.Начните счетчик с 3 и уменьшите его в конце каждого потока. Когда последний поток завершит свою работу (т. Е. Его уменьшение устанавливает счетчик на 0), сделайте это обратным вызовом в интерфейсе пользователя.

(Второй пункт может быть тем, что вы уже делали ... трудно сказать наверняка, учитывая описание просто «Я использовал счетчик».)

Хотя я полностью вижу, гдеВы исходите из того, что поток управления приложением намного сложнее в мире, управляемом событиями, именно так работает Swing (и так работает большинство других сред пользовательского интерфейса).Вы просто не можете заблокировать поток пользовательского интерфейса.(Именно поэтому в C # 5 все упрощается на уровне language ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...