Поддерживает ли Javafx запуск собственного потока? - PullRequest
3 голосов
/ 23 июня 2010

Я написал простое приложение Javafx, которое запускает новый поток и работает нормально с Netbeans.Но я получаю следующее предупреждение во время компиляции:

explicit use of threads is not supported

Означает ли это, что теперь он может работать на всех возможных устройствах, таких как мобильные телефоны или браузер?

Ответы [ 2 ]

1 голос
/ 24 июня 2010

Сам JavaFX должен работать в основном потоке JavaFX, поэтому запуск потока непосредственно из JavaFX в настоящее время не поддерживается. Однако вы можете создать класс Java, который порождает поток. Итак, ваш класс JavaFX вызывает класс Java, который затем запускает поток.

Для обратного вызова JavaFX из потока Java вы должны быть в основном потоке JavaFX. Пример того, как это сделать:

import com.sun.javafx.runtime.Entry;
Entry.deferAction( new Runnable() {
                    @Override
                    public void run() {
                        fxListener.onMessage(copy);
                    }
                } );

Вы не должны манипулировать объектами JavaFX напрямую из Java. Если вы делаете это из Java, вам нужно использовать классы javafx.reflect.

0 голосов
/ 04 августа 2010

Я должен порекомендовать 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;
     }
 }

Это полезно для отправки таких вещей, как сообщения журнала, из фонового потока для отображения в каком-то пользовательском интерфейсе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...