?

Log in

Previous Entry | Next Entry

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

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

Все комментарии можно оставлять в этой теме.

Comments

( 13 comments — Leave a comment )
ud2
Aug. 20th, 2010 09:57 am (UTC)
Спасибо! Как всегда очень штучно, интересно, полезно и просто эстетически красиво ;)
magicprinc
Aug. 25th, 2010 05:05 am (UTC)
Отличная статья, спасибо!
(Anonymous)
Aug. 23rd, 2010 11:07 am (UTC)
Синхронизация get/set Progress
SwingWorker.java:217
private volatile int progress;

Так что свойство Progress является синхронизированным.
skipy_ru
Aug. 25th, 2010 07:41 am (UTC)
Re: Синхронизация get/set Progress
О как! Проглядел! Спасибо за комментарий, изменил в статье!
ext_242636
Aug. 25th, 2010 10:55 am (UTC)
Volatile
Прошу прощения, что пишу сюда. Обсуждения для статьи Синхронизация Потоков нет, а тема с volatile здесь подымалась.

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

Это поведение дает возможность реализовывать, например, ConcurrentHashMap без захвата монитора. см. ConcurrentHashMap.java:335.
skipy_ru
Aug. 25th, 2010 01:44 pm (UTC)
Re: Volatile
Добрый день!

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

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

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

P.S. Пишут регулярно. :)
ext_242636
Aug. 25th, 2010 01:49 pm (UTC)
Re: Volatile
Прошу прощения.
skipy_ru
Aug. 25th, 2010 03:40 pm (UTC)
Re: Volatile
Ой, да Бог с Вами! За что извиняться-то? Я, наоборот, очень рад подобным письмам. Они как минимум означают, что мои статьи кому-то интересны. А как максимум - мотивируют что-то сделать. Сегодня, например, я понял, что надо освежить в памяти Java memory model. Напечатал пресловутую 17-ю главу JLS, сижу, читаю. И это благодаря Вашему письму.

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

С уважением,
Евгений aka Skipy
ext_242636
Aug. 31st, 2010 06:08 pm (UTC)
GuiActionRunner из FEST
Иногда требуется обратное по отношению к 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-коде страшновато.
skipy_ru
Sep. 1st, 2010 09:56 am (UTC)
Re: GuiActionRunner из FEST
Да, неплохо. Компактно. Близко к моему варианту с аннотацией, когда выполнение идет в синхронном режиме. А вообще, конечно, надо бы написать оболочку для подобных вызовов. Вызов invokeAndWait с Runnable - очень громоздко. Вот замыкания бы тут пригодились...
(Anonymous)
Oct. 29th, 2010 02:27 pm (UTC)
Синхронизация пользовательского интерфейса
Здравствуйте Евгений.
Я небольшой специалист программировать на JAVA, но мне нужно реализовать программу чтения файлов с прогресс баром. Прошу вас прислать мне недостающие классы ControllableCapacityInputStream и CapacityUnit на mail nick@rietumu.lv
Спасибо
skipy_ru
Nov. 1st, 2010 06:50 am (UTC)
Re: Синхронизация пользовательского интерфейса
Добрый день!

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

Мне не жалко прислать Вам эти классы, я просто хочу быть увереным, что Вы понимаете, что делаете. Если Вам действительно нужно именно это - не вопрос, пришлю. Если Вы просто не понимаете, как переписать код и выбросить эти классы - тоже могу подсказать. Уточните, пожалуйста, что именно Вам нужно.
deart_69
Jan. 28th, 2013 05:44 pm (UTC)
Благодарю Вас, автор, за ваши статьи. Как совсем начинающему это очень даже, но иногда такое написано, с ума спрыгнуть, прочитав эту статью про синхронизацию, почувствовал себя таким дураком ибо ничего не понял =(...
( 13 comments — Leave a comment )