Я должен порекомендовать JFXtras (http://jfxtras.org/) класс XWorker. По сути, это обходной путь к проблеме, о которой вы упомянули, в которой он позволяет использовать код JavaFX в фоновом потоке. Он хорошо работает для большинства задач, ноэто также немного опасно в том смысле, что вы можете легко создавать код, который не является поточно-ориентированным с ним.
См .: http://jfxtras.googlecode.com/svn/site/javadoc/release-0.6/org.jfxtras.async/org.jfxtras.async.XWorker.html
Основное использование:
var currentImage:Image;
var worker = XWorker {
inBackground: function() {
return Image {url: currentFile.toURL().toString(), height: imageHeight};
}
onDone: function(result) {
currentImage = result as Image;
}
}
Все, что делается в inBackground, выполняется в фоновом потоке Swing. Этот поток может вернуть результат, который будет передан в onDone. OnDone выполняется в потоке диспетчеризации событий JavaFX (основной поток, в котором выполняется весь другой код JavaFX), поэтомуВы можете вернуться к обычному использованию. Думайте об этом как о переднем плане. По большей части вы не хотите получать доступ к чему-либо в BackBackground, к которому также можно получить доступ одновременно в «переднем плане». Вы можете сделать исключение из этого правиладо тех пор, пока объекты, которыми вы делитесь между потоками, являются поточно-ориентированными. По большей части код JavaFX не может быть поточно-безопасным, но• Вы можете использовать объекты, безопасные для потоков Java (например, фабрики JPA EntityManager) или контейнеры, такие как BlockingQueue.Последнее может быть полезно для создания модели «Производитель / Потребитель».
Кроме того, если у вас есть долгосрочное задание и вы хотите периодически отправлять обновления на «передний план», вы можете использовать публикацию / процесс.Вот пример:
var worker = XWorker {
inBackground: function() {
while (true) {
// Do something
publish(someStuff);
}
}
process: function(someStuff: SomeStuff[]):Void {
// Do something with some stuff. You are now in
// "the foreground", so you can freely access
// JavaFX objects.
}
onDone: function(result) {
currentImage = result as Image;
}
}
Это полезно для отправки таких вещей, как сообщения журнала, из фонового потока для отображения в каком-то пользовательском интерфейсе.