【问题标题】:JavaFX thread synchronization with Java threadJavaFX 线程与 Java 线程同步
【发布时间】:2012-11-07 04:38:22
【问题描述】:

有没有办法同步 JavaFX 平台线程和标准 Java 线程?目前,当触发时,JavaFX 线程会在标准 Java 线程完成将所有图像添加到可观察列表之前触发,因此 imageList 会更新为空白集合。

private final TilePane imageList;
final File[] files = new File(dir).listFiles();
final List<ImageView> views = FXCollections.observableArrayList();

new Thread() {
        @Override
        public void run() {
            for (final File file : files) {
                if (Utils.fileIsImage(file) && !file.isDirectory()) {
                    ImageView view = new ImageView(new Image("file:" + file, 72, 72, false, true));
                    views.add(view);
                }
            }
        }
    }.start();
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            imageList.getChildren().addAll(views);
        }
    });

我对 JavaFX 和并发性比较陌生,对线程锁没有任何经验,所以任何帮助都会很棒。谢谢!

【问题讨论】:

    标签: java multithreading javafx-2 java.util.concurrent


    【解决方案1】:
    new Thread() {
        @Override
        public void run() {
            for (final File file : files) {
                if (Utils.fileIsImage(file) && !file.isDirectory()) {
                    ImageView view = new ImageView(new Image("file:" + file, 72, 72, false, true));
                    views.add(view);
                }
            }
    
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    imageList.getChildren().addAll(views);
                }
            });
        }
    }.start();
    

    考虑一一添加视图,只要它们已加载:

    if (Utils.fileIsImage(file) && !file.isDirectory()) {
        ImageView view = new ImageView(new Image("file:" + file, 72, 72, false, true));
        views.add(view);
    
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                imageList.getChildren().add(view);
            }
        });
    }
    

    【讨论】:

    • 这已经成功了,非常感谢!然而,对于大量图像来说,这并不是最有效的解决方案,但目前这比我预期的要简单得多..
    • 对于大量图像,启动多个线程(2-4)。首先将所有文件的名称放入一个队列中,让每个线程轮询该队列并在队列为空时退出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2018-11-02
    • 1970-01-01
    相关资源
    最近更新 更多