2015-02-25 3 views
0

Рабочий поток используется для обработки очень долговременной задачи. В середине выполнения задачи требуется взаимодействие с пользователем для получения входных данных. По мере ввода входов рабочий поток возобновит выполнение. Моя проблема заключается в том, что рабочий поток нужно приостановить, получить входные данные (скажем, через диалоговое окно - я использую API-интерфейс Dialogs JDK8u40, который должен быть облегчен потоком приложений JavaFX) и возобновить его после. Входы не поставляются в начале из-за зависимости определенных ситуаций, и входы могут потребоваться много раз.JavaFX: Worker Thread нуждается в приложении JavaFX Thread для продолжения

Типичный пример: файлы копируются из одной директории в другую. По мере копирования файлов в каталоге назначения существует файл с тем же именем файла, поэтому требуется взаимодействие с пользователем, чтобы переименовать файл или пропустить копирование файлов, чтобы избежать конфликта имен файлов. В этом случае рабочий поток должен выполнять копирование файлов и должен быть приостановлен для получения входных данных от пользователя (должен облегчаться потоком приложений JavaFX), прежде чем продолжить. Platform.runlater (() -> {}); не может сделать такую ​​ситуацию, поскольку она просто поставила бы в очередь объект Runnable, который будет запущен в будущем.

Как облегчить этот сценарий? Я новичок в параллелизме JavaFX.

ответ

1

Вы можете использовать механизм уведомления о ожидании, как описано здесь: http://www.avajava.com/tutorials/lessons/how-do-i-use-the-wait-and-notify-methods.html. Когда требуется взаимодействие, runnable запускается через поток ui, чтобы запросить пользователя. Рабочий поток вызывает ожидание. Поток ui в конечном итоге получает пользовательский ввод и уведомляет рабочий поток, который продолжает свою работу в соответствии с полученным им сообщением. Разница здесь в том, что вам не нужно создавать два потока, поскольку нить ui уже существует.