Реализация многопоточности в JavaFX. — КиберПедия 

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Реализация многопоточности в JavaFX.

2022-10-10 43
Реализация многопоточности в JavaFX. 0.00 из 5.00 0 оценок
Заказать работу

https://docs.oracle.com/javafx/2/api/index.html?javafx/concurrent/Worker.html Методы updateXXXX() можно вызывать из любого потока. Они изменяют свойства унаследованные из интерфейса Worker<V>, причём все свойства в ReadOnly. А затем в потоке JavaFXApplicationThread мы используем эти значения, например, через связывание данных.

Этот проект лежит в каталоге «синхронная версия». Почему называется синхронная версия? Потому что поток пользовательского интерфейса блокируется.

Путь: Лабы Java2\3-JavaFX\Lab2\synkVersion\JavaFXApplication4

Надо немножко поправить проект. Откройте, пожалуйста, пакеты. А в пакетах файл fxml. Это тот самый пользовательский интерфейс, который вы разрабатывали, которая должна искать файлы. Теперь она будет искать файлы. Но здесь у меня стоят странные имена жесткого диска. ПоменяйтевFXML файле «G:\» на «C:\».

Программарабочая. Тольконеторопитесь, а то вы как пользователи перезапускать компьютер начнете. Кнопочка «Find» - элемент обработчик, который запускается в потоке пользовательского интерфейса. Поиск на жестком диске долгий, а значит происходит блокировка. Помнитемынапервомзанятииговорили: «зачемнужнамногопоточность?». Вотзачемонанужна! ВынажалиFind. Всё!!! Висим!!! Понимаете, да? Акакойувастамразмерэтого «C:\»? Янезнаю. Пишет «Программанеотвечает». Пользовательговорит: «АХ!!! КАКЭТОНЕОТВЕЧАЕТ???». И запустил resetкомпьютера.

Только не начинайте тут все исправлять! Мы еще не разобрали, как делать многопотоковость в JavaFX. Мы пока смотрим только эту программу.

Мы ее открыли и будем дальше исправлять. А что тут надо исправлять? А кнопочка Findдолжна запускать новый поток. Кстати у меня просто написано: newThread. Я, кстати, попытался один раз сделать ThreadPool на два потока – не вышло. Там надо ставить обработчик на закрытие приложения, потому что пул потоков нужно освобождать. Атоонунасвпамятивисит. Т.е. когда программа завершается, надо любой ThreadPoolнадо закрывать. Мы делаем это через shutdown(). А тут если этого не сделать, то программа работает. Закончилаработать. Крестикомеезакрыл. Апулпотоков-тоостался. Ионвиситвпамяти. Нужно добавлять обработчик на событие close(). Нуянесталзаморачиватьсяипоставил newThread.

Итак, намнуженпоток. Но если вы сейчас начнете запускать потоки, то это ведь что получается? Если кнопочка Find будет искать новые данные, которые потом нужно вывести на экран, то простите. Новый поток не может обращаться к элементам управления JavaFX. Это однопотоковый интерфейс. Если вы сейчас попытаетесь вывести что-нибудь на экран из другого потока, то это JavaFXпроверяет и вылезет Exception.

Поэтому просить нас каждый раз: «не забывать из правильного потока обращаться к элементам управления» - это очень для нас накладно будет. Этоработаоченьтяжелаяикропотливая. Необъемная, нокропотливая. И еще очень много проблем возникнет. Поэтомупредставьтедолгоиграющуюработупользовательначал. Акакееотменить? Надопридуматьмеханизмотмены. Акакузнатьсколькобылопроцентовсделано, чтобынашползунокдвигался? Ведь эта долгоиграющая работа должна, которая запускает потоки как-то сообщать. Акаконамнеэтобудетсообщать? Опятьвопрос. Учтите! Онавдругомпотоке! Это должна быть программа, которая по идее многопотоковой программой и является. У вас есть поток пользовательского интерфейса, есть вспомогательный поток. Как они общаться между собой будут? Вот для того, чтобы мы не решали каждый раз в каждом проекте ЭТО одно и то же, они сделали нам интерфейс - есть Taskи Service.

Выбор? Почитайте, там все просто.

· Если вам нужна однократная работа. Сделай или начал делать и Cancel. И забыл и выбросил. Это Task.

· А если вам нужно: запустил, что-то не пошло. Остановилиперезапустил. Ипотомпостоянноповторнозапускать. ТоэтоService. Т.е. он идет с дополнительным функционалом «аля повторный перезапуск».

Самое важное – это то, что вот в этом интерфейсе есть методы, которые можно вызывать из любого потока. Потокобезопасные методы. Вот эти методы называются: «updateXXXX()», чтобы вы не запутались - четыре штуки.

· updateProgress

· updateMessage

· updateValue

· updateTitle.

Вот они здесь вызываются из какого потока? А не важно! Они потокобезопасны. Поэтому вы можете их вызывать где угодно и как угодно. И что делает updateMessage()? Какое-то сообщение изменится. А updateProgress()? Вот в этом объекте Taskбудет сказано, что он сделал, например, 20%. И т.к. этот updateProgress() можно вызывать где угодно, то вы внутри своего вспомогательного потока можете говорить: «сделал 10%», «сделал 40%», «сделал 60%». Эта информация будет находиться внутри Task. Ее оттуда уже можно вытянуть. Она уже лежит в объекте. Этот объект работает не на дереве потоков, а JavaFXего создает. Поэтому вот код, который нам нужен, чтобы интерфейс был нормальным.

Task – работу долгоиграющую по кнопочке кликнули и раз! Все в отдельный поток закинули. Этот Taskнадо класть в Thread. Но главное, что у нас здесь есть возможность сообщать об изменениях из потока. Кому? updateProgressсообщает Task. А вот та строчка, которая будет написана в лабе:

«Добавьте эту строчку» - вот она строчка. Мы берем Progress – это элемент управления на экране и у него берется Property. Только через PropertyDataBindingработает. Вы берете для Property bind () (одностороннюю связь естественно), берем Task, у него тоже есть Propertyи его привязываем к этому свойству, которое на экране. И когда вы здесь вызываете updateProgress, на экране происходит перерисовка.

Проблема с обновлением вот этого ползунка только одна. Я не знаю, сколько там pdf файлов и не знаю, когда это закончится. Поэтому сейчас так популярно кольцо, которое вращается. Вот у меня hard-codedсделано. Сейчас посмотрю, какое у меня число вбито. Если в потом программу запустите вы будете примерно знать, сколько у вас pdfфайлов. И можно будет сделать покрасивее. У меня hard-codedна 200 поставлено.

В лабораторной работе принято еще несколько допущений. Это может нравиться, может не нравиться. Когда пользователь нажимает Cancel, он удаляет все найденные до этого данные. Т.е. на экран не выводится ничего.

После того, как вы сделаете лабораторную работу – это будет многопотоковое приложение. У вас будет DataBinding. И обратите внимание, когда у вас будут изменяться данные в списке, вам не придется каждый раз говорить: «на экран их выведи, на экран их выведи». Не надо! Почему? А посмотрите Controllerкакой красивый.

В контроллере (мы его в прошлый раз не видели) есть метод initialize(). В этом методе подвязана коллекция «items», сделана подписка на изменения, если что-то добавилось или убавилось. Вот он обработчик – onChanged(). И этот обработчик выводит данные на экран. Причем видите? Это сделано в контроллере, а не в коде моей программы.


Переход по ссылке

 



Поделиться с друзьями:

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.009 с.