Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX线程与Java线程的同步_Java_Multithreading_Javafx 2_Java.util.concurrent - Fatal编程技术网

JavaFX线程与Java线程的同步

JavaFX线程与Java线程的同步,java,multithreading,javafx-2,java.util.concurrent,Java,Multithreading,Javafx 2,Java.util.concurrent,有没有办法同步JavaFX平台线程和标准Java线程?当前,当被触发时,JavaFX线程在标准Java线程完成将所有图像添加到可观察列表之前触发,因此imageList将使用空白集合进行更新 private final TilePane imageList; final File[] files = new File(dir).listFiles(); final List<ImageView> views = FXCollections.observableArrayList();

有没有办法同步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和并发性比较陌生,并且没有任何线程锁的经验,所以任何帮助都会很好。谢谢

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);
        }
    });
}
只要已加载视图,请考虑逐个添加视图:

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开始执行多个线程。首先将所有文件的名称放在一个队列中,让每个线程轮询该队列,并在队列为空时退出。这已经奏效了,非常感谢!然而,这并不是针对大量图像的最有效解决方案,但就目前而言,这是一个比我预期的简单得多的解决方案。对于大量图像,请从2-4开始执行多个线程。首先将所有文件的名称放入队列,让每个线程轮询该队列,并在队列为空时退出。