Евгений Матюшкин (skipy_ru) wrote,
Евгений Матюшкин
skipy_ru

Обсуждение статьи "Синхронизация пользовательского интерфейса"

Еще одна статья вышла. На этот раз - про синхронизацию пользовательского интерфейса. Про выполнение длительных задач так, чтобы не блокировать весь интерфейс. В последнее время что-то количество вопросов на эту тему превысило все разумные пределы.

В общем, статья тут: http://www.skipy.ru/technics/gui_sync.html. Читайте!

Все комментарии можно оставлять в этой теме.
Tags: article, gui, synchronization, threads, статья
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 13 comments
Спасибо! Как всегда очень штучно, интересно, полезно и просто эстетически красиво ;)
Отличная статья, спасибо!
SwingWorker.java:217
private volatile int progress;

Так что свойство Progress является синхронизированным.
О как! Проглядел! Спасибо за комментарий, изменил в статье!
Прошу прощения, что пишу сюда. Обсуждения для статьи Синхронизация Потоков нет, а тема с volatile здесь подымалась.

Неверно считать, что volatile только отключает механизмы синхронизации для переменной. Этот модификатор доступа гарантирует большее: обращение к переменной не будет переставлено местами с другими инструкциями с точки зрения всех потоков.

Это поведение дает возможность реализовывать, например, ConcurrentHashMap без захвата монитора. см. ConcurrentHashMap.java:335.
Добрый день!

Разумеется, volatile делает не только то, что я написал. Более того, я об этом знаю. :) Просто в своих статьях я ориентируюсь на определенный уровень читателей. Если я полезу в дебри спецификации VM - большинство просто потеряет нить. Им это будет неинтересно, что, в конечном итоге, скажется на понимании основного материала.

Это все равно, что при описании ключевого слова synchronized перевести половину 17-й главы спецификации языка - про мониторы, блокировки, модель памяти, оптимизации и т.п. Я вот про это: http://java.sun.com/docs/books/jls/third_edition/html/memory.html. Безусловно, это всё имеет отношение к делу, однако у неподготовленного человека вызовет головокружение.

А потому - для большинства достаточно того, что я описал. Кто хочет знать больше - в итоге возьмет спецификацию, прочитает, увидит, что у меня в статье она переведена не вся, и напишет мне об этом. :)

P.S. Пишут регулярно. :)
Прошу прощения.
Ой, да Бог с Вами! За что извиняться-то? Я, наоборот, очень рад подобным письмам. Они как минимум означают, что мои статьи кому-то интересны. А как максимум - мотивируют что-то сделать. Сегодня, например, я понял, что надо освежить в памяти Java memory model. Напечатал пресловутую 17-ю главу JLS, сижу, читаю. И это благодаря Вашему письму.

Так что если Вам есть что сказать по поводу других статей - пишите, я с удовольствием почитаю. И если Вам кажется, что что-то можно добавить - тоже пишите. Часто бывает так, что я написал статью, она полежала пару лет, а поотом я понимаю, что в нее можно что-то дописать. И еще что-то. И опять. И снова. И всё это, в основном - по результатам чьих-то писем!

С уважением,
Евгений aka Skipy
Иногда требуется обратное по отношению к SwingWorker'у: действие выполняется в background потоке, а надо получить какой-нибудь результат из swing'a.

Пример: выполняется запрос к серверу, возникает ошибка - надо спросить пользователя что делать: Retry/Abort. Я в таких случаях использую следующее:

boolean retry =
GuiActionRunner.execute(new GuiQuery() {
public Boolean executeInEDT() {
return JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(**);
}
});

Класс GuiActionRunner доступен в библиотеке FEST-swing (http://easytesting.org/). Единственный минус - библиотека предназначена для тестирования и использовать ее в production-коде страшновато.
Да, неплохо. Компактно. Близко к моему варианту с аннотацией, когда выполнение идет в синхронном режиме. А вообще, конечно, надо бы написать оболочку для подобных вызовов. Вызов invokeAndWait с Runnable - очень громоздко. Вот замыкания бы тут пригодились...
Здравствуйте Евгений.
Я небольшой специалист программировать на JAVA, но мне нужно реализовать программу чтения файлов с прогресс баром. Прошу вас прислать мне недостающие классы ControllableCapacityInputStream и CapacityUnit на mail nick@rietumu.lv
Спасибо
Добрый день!

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

Мне не жалко прислать Вам эти классы, я просто хочу быть увереным, что Вы понимаете, что делаете. Если Вам действительно нужно именно это - не вопрос, пришлю. Если Вы просто не понимаете, как переписать код и выбросить эти классы - тоже могу подсказать. Уточните, пожалуйста, что именно Вам нужно.
Благодарю Вас, автор, за ваши статьи. Как совсем начинающему это очень даже, но иногда такое написано, с ума спрыгнуть, прочитав эту статью про синхронизацию, почувствовал себя таким дураком ибо ничего не понял =(...